Лямбды в троичном операторе неожиданного поведения - PullRequest
0 голосов
/ 10 октября 2019
>>> (lambda: 1 if True else lambda: 2)()
1
>>> (lambda: 1 if False else lambda: 2)()
<function <lambda>.<locals>.<lambda> at 0x7f5772e8eef0>
>>> (lambda: 1 if False else lambda: 2)()()
2

Почему это требует вызова последнего дважды?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Если вы напишите это как lambda: 1 if condition else lambda: 2, это будет интерпретировано так:

lambda: (1 if condition else lambda: 2)

Вам нужно написать это так, чтобы оно работало как задумано:

(lambda: 1) if condition else lambda: 2
0 голосов
/ 10 октября 2019
lambda: 1 if False else lambda: 2

Позвольте мне написать это как обычную функцию с операторами if:

def func():
    if False:
        return 1
    else:
        return (lambda: 2)

Теперь, если я это сделаю:

x = func()

x будет lambda: 2- что является еще одной функцией.

Итак, как мне добраться до 2?

x()

Это дает:

2

Теперь, если я включу переменную x:

res = func()()

Теперь res будет 2

Надеюсь, это было понятно. Вот почему два () было необходимо.

Возможно, вы хотели что-то вроде этого:

(lambda: 1) if False else (lambda: 2)

Это обычные функции, возвращающие оператор if.

...