Является ли хорошей идеей использовать «is», чтобы проверить, какая функция содержится в переменной? - PullRequest
3 голосов
/ 08 ноября 2019

У меня есть переменная, которая содержит функцию.

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

, оба возвращают то, что я ожидаю.

Ответы [ 2 ]

4 голосов
/ 08 ноября 2019

Это одно и то же для функционального объекта. Оператор == вызывает функцию __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.

0 голосов
/ 08 ноября 2019

Проверяет личность объекта. Если вы присваиваете foo для myvar, то создается псевдоним, и оба имеют одинаковый идентификатор (по крайней мере, в случае функций).

Проверка 2 функций на эквивалентность с математической точки зрения влечет за собой проверкуэквивалентность доменов и кодоменов обеих функций.

Так что is лучше.

...