Python короткое замыкание функций - PullRequest
0 голосов
/ 31 октября 2018

Я знаю, что короткое замыкание Python работает с функциями. Есть ли причина, по которой он не будет работать, когда две функции объединены в одну? Т.е. почему это короткое замыкание,

>>> menu = ['spam']
>>> def test_a(x):
...     return x[0] == 'eggs'  # False.
...
>>> def test_b(x):
...     return x[1] == 'eggs'  # Raises IndexError.
...
>>> test_a(menu) and test_b(menu)
False

тогда как это не так?

>>> condition = test_a and test_b
>>> condition(menu)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test_b
IndexError: list index out of range

1 Ответ

0 голосов
/ 31 октября 2018

Когда вы сделали это:

>>> condition = test_a and test_b

вы неправильно ожидали получить новую функцию, которая возвращает результат test_a(x) and test_b(x). Вы действительно получили оценку логического выражения :

x and y: если x ложно, то x , иначе y

Поскольку истинное значение для test_a и test_b равно True, condition установлено на test_b. Вот почему condition(menu) дает тот же результат, что и test_b(menu).

Чтобы добиться ожидаемого поведения, выполните:

>>> def condition(x):
...     return test_a(x) and test_b(x)
...
...