Karthikeyan Singaravelan <tir.kar...@gmail.com> added the comment:

Thanks for the report. Can you please add an example without Django or other 
dependencies so that I can try reproducing it? I am trying out the below 
program from the report where Foo has overridden __eq__ to return False if the 
other object being compared is not a Foo object. In the next statements ANY == 
Foo() returns True since the left side's object.__eq__ is used which in this 
case is ANY.__eq__ as you have noted in the original report. 

When list of call objects are compared there is also a code comment about this 
in the tuple comparison  of args and kwargs such that ANY is placed on the left 
side [0] so that ANY.__eq__ is used. A pure python example and traceback if any 
would help here.


from unittest.mock import call, ANY, Mock

class Foo:

    def __eq__(self, other):
        if not isinstance(other, Foo):
            return False
        return True

m = Mock()
obj = Foo()
m(obj, 1)
m.assert_has_calls([call(ANY, 1)])

print(ANY == Foo()) # ANY.__eq__ is called
print(Foo() == ANY) # Foo().__eq__ is called

Is the report more about the below case where position of call objects returns 
different values?

print(call(ANY, 1) == call(obj, 1)) # False
print(call(obj, 1) == call(ANY, 1)) # True


[0] 
https://github.com/python/cpython/blob/2a3d4d9c53dd4831c3ecf56bc7c4a289c33030d6/Lib/unittest/mock.py#L2407

----------
components: +Library (Lib) -Tests
nosy: +xtreak
versions:  -Python 3.5, Python 3.6

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

Reply via email to