测试函数对象(functor)是否相等,如何求值?我使用 `is` 还是 `==`?
Testing function object (functor) equality, how is it evaluated? Do I use `is` or `==`?
考虑这些功能:
def f():
print("WTF?!")
def g():
print("WTF?!")
他们都做同样的事情,但是 f == g
的测试仍然给出 False
。我是否由此假设函子相等性是通过引用求值的,并且 is
和 ==
之间没有区别?
无论情况是否如此,哪个更好用(即使只是风格上)?
顺便说一下,我主要对 Python 3 (Python 3.6) 感兴趣。
编辑
我认为 This question 不是 重复。我了解引用相等和值相等之间的区别,我只是想了解 ==
如何在函子上使用值相等(如果有的话)。
不,你不能,因为这个:
函数对象没有自定义__eq__
method (this method is called when comparing values with ==
) so they fall back to the superclasses __eq__
method. In this case it's object.__eq__
which, indeed, just compares if they are the same object。
所以:
>>> f == g
False
与(在本例中)相同:
>>> f is g
False
以防万一你感兴趣我怎么知道函数没有自定义 __eq__
方法:
>>> type(f).__eq__ is object.__eq__
True
考虑这些功能:
def f():
print("WTF?!")
def g():
print("WTF?!")
他们都做同样的事情,但是 f == g
的测试仍然给出 False
。我是否由此假设函子相等性是通过引用求值的,并且 is
和 ==
之间没有区别?
无论情况是否如此,哪个更好用(即使只是风格上)?
顺便说一下,我主要对 Python 3 (Python 3.6) 感兴趣。
编辑
我认为This question 不是 重复。我了解引用相等和值相等之间的区别,我只是想了解 ==
如何在函子上使用值相等(如果有的话)。
不,你不能,因为这个:
函数对象没有自定义__eq__
method (this method is called when comparing values with ==
) so they fall back to the superclasses __eq__
method. In this case it's object.__eq__
which, indeed, just compares if they are the same object。
所以:
>>> f == g
False
与(在本例中)相同:
>>> f is g
False
以防万一你感兴趣我怎么知道函数没有自定义 __eq__
方法:
>>> type(f).__eq__ is object.__eq__
True