Python лямбда возвращает истину даже при ложном условии - PullRequest
0 голосов
/ 09 мая 2018
>>> if lambda x: True == True:
... print('yes')
...
yes
>>> if lambda x: False == True:
... print('yes')
...
yes

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Вы не звоните своим лямбдам. Здесь вы проверяете логическое значение самого лямбда-объекта (фактически function -объекта), что, конечно, всегда верно.

Если вы хотите проверить результат лямбды, вы должны вызвать его - и в вашем случае вам придется передать ему аргумент, поскольку вы определяете, что он принимает аргумент:

if (lambda x: True)(42):
   print("yes")

if (lambda x: False)(42):
   print("no")

Теперь это не имеет смысла в вашем фрагменте, так как лямбды Python ограничены одним выражением, так что вы также можете заменить целое (lambda x: whatever_expression)(whatever_value) на whatever_expression.

Также, как упоминает Чепнер, ваше if состояние фактически анализируется как:

if (lambda x: True == True):

не как:

if (lambda x: True) == True:

здесь это не имеет большого значения, так как, как я объяснил вначале, здесь проверяется логическое значение самого лямбда function объекта, но в любом случае ... Как правило, точное тестирование по True или False бесполезен в python - все объекты имеют логическое значение, и все выражения дают объекты, поэтому это

if some_expression == True:

совпадает с

if some_expression:
0 голосов
/ 09 мая 2018

Вы не называете свою лямбду, как я объяснил в моем комментарии, но если вы хотите, чтобы это было встроено, вы можете проверить как:

if (lambda x: True == True)(None):
    print("yes")  # prints

if (lambda x: False == True)(None):
    print("yes")  # doesn't print

Или более общий, поскольку вы не используете никаких аргументов в своих лямбдах:

if (lambda: True == True)():
    print("yes")  # prints

if (lambda: False == True)():
    print("yes")  # doesn't print
0 голосов
/ 09 мая 2018

Ваш код анализируется так же, как

if (lambda x: (True == True)):
    print('yes')

, что означает, что вы определяете функцию, которая всегда возвращает True, но затем проверяете, имеет ли эта функция истинное значение, что происходит потому, что все function объекты являются правдивыми.

Вы хотите вызвать функцию с некоторым аргументом; для этого примера я только что создал произвольный экземпляр object, но аргумент может быть буквально что угодно .

if (lambda x: True)(object()) == True
    print('yes')

Проще увидеть, если разбить его на несколько строк:

f = lambda x: True
some_arg = object()
if f(some_arg) == True:   # or just if f(some_arg):
    print('yes')
0 голосов
/ 09 мая 2018

Чек в lambda не имеет значения . Что происходит, это:

>>bool(lambda x: <anything>)  # 1
True

1. Пока нет SyntaxError, конечно, поднят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...