New submission from Kirk McDonald:

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.

----------
messages: 256508
nosy: KirkMcDonald
priority: normal
severity: normal
status: open
title: Code objects from same line can compare equal

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25879>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to