使用 "is" 检查变量中包含哪个函数是个好主意吗?

Is it a good idea to use "is" to check which function is contained in a variable?

我有一个包含函数的变量。

def foo(x):
    return x + 42

def bar(x):
    return x - 42

my_var = foo

我想检查那个函数是否是某个函数。我应该使用 is 还是 ==

my_var == foo
my_var == bar

my_var is foo
my_var is bar

两者都 return 我所期望的。

是检查对象的身份。如果将 foo 分配给 myvar,则会创建一个别名,并且它们都具有相同的 ID(至少在函数的情况下)。

从数学的角度检查 2 个函数的等价性需要检查两个函数的域和辅域的等价性。

所以is更好。

它们对于函数对象来说是一样的。 == 运算符调用 __eq__ 函数来执行比较。 function 对象没有定义 __eq__ 方法:

>>> def foo():
...   pass
... 
>>> foo.__eq__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__eq__'

因此解释器使用PyObject中的默认实现:

res = (v == w) ? Py_True : Py_False;

这基本上是一个指针比较,本质上与is相同。

不,你应该使用 ==

一个好的经验法则是只在做 is Noneis not None 时使用 is 而别处。在这种情况下,将 functionsis 进行比较是可行的,但是如果您尝试比较 method [=32] 的实例=] 本身你会得到 False (即使在同一个实例上),而与 == returns 相比你期望的是:

>>> class A:
...     def my_method(self):
...         pass
... 
>>> a = A()
>>> a.my_method is a.my_method
False
>>> a.my_method == a.my_method
True

最好避免记住这一点,并始终将函数与 == 进行比较。

看到这个问题:Why don't methods have reference equality?