This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author KirkMcDonald
Recipients KirkMcDonald
Date 2015-12-16.04:07:47
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1450238867.99.0.650627137884.issue25879@psf.upfronthosting.co.za>
In-reply-to
Content
The following code gives an unexpected result:

>>> a, b = lambda: 1, lambda: 1.0
>>> a()
1
>>> b()
1
>>> type(b())
<class 'int'>
>>> a.__code__ is b.__code__
True

The cause boils down to this line of code:

https://hg.python.org/cpython/file/33ff335da34c/Objects/codeobject.c#l442

When it compiles the two lambdas, their code objects compare equal. They have the same name, the same bytecode, and start on the same line. And, because 1 == 1.0, their constants compare equal. This then prompts the compiler to combine the two code objects into a single constant in the enclosing code object, discarding the second one.

I think the solution is to have code_richcompare also check whether the types of the constants are equal, in addition to the constants themselves.
History
Date User Action Args
2015-12-16 04:07:48KirkMcDonaldsetrecipients: + KirkMcDonald
2015-12-16 04:07:47KirkMcDonaldsetmessageid: <1450238867.99.0.650627137884.issue25879@psf.upfronthosting.co.za>
2015-12-16 04:07:47KirkMcDonaldlinkissue25879 messages
2015-12-16 04:07:47KirkMcDonaldcreate