если + или не удается, даже если работает обратное условие - PullRequest
0 голосов
/ 14 января 2020

Я учу себя python и пытаюсь понять, почему не работает приведенный ниже пример.

#!/usr/bin/python3.4
vWHEN = sys.argv[1]
print (vWHEN)
if vWHEN != "before" or vWHEN != "after":
 exit("ERROR: " + vWHEN + " is invalid. Should be: 'before' or 'after'")

Вывод выглядит следующим образом:

$ ptest.py before
before
ERROR: before is invalid. Should be: 'before' or 'after'

Но следующее работает работает:

#!/usr/bin/python3.4
vWHEN = sys.argv[1]
if vWHEN == "before" or vWHEN == "after":
 print (vWHEN)
else:
 exit("ERROR: " + vWHEN + " is invalid. Should be: 'before' or 'after'")

Вывод:

$ ptest.py before
before

Ответы [ 3 ]

4 голосов
/ 14 января 2020

Вы имеете дело с ошибкой logi c. Давайте начнем с текущей версии (2-й):

if a == "before" or a == "after":

Это читается как Engli sh, условие действительно, если a равно "before" или "after". Однако ваша первая (неправильная) версия:

if a != "before" or a != "after":

Это всегда будет True, поскольку a не может иметь 2 значения, поэтому одна из ветвей or всегда будет True.


Решение :

Давайте применим L Моргана де Моргана aws, чтобы увидеть, как инвертировать условные логики c. Чтобы представить обратный логарифм c вашего правильного регистра, который был

A or B

, нам нужно

not (A or B)

, которое согласно l aws равно

(not A) and (not B)

Поэтому правильной версией для вашего первого оператора if должно быть:

if a != "before" and a != "after":  # notice the and instead of the or

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

if a in ("before", "after"):

или

if a not in ("before", "after"):

Это читается намного проще, поэтому также легче рассуждать с

2 голосов
/ 14 января 2020

vWHEN != "before" or vWHEN != "after" всегда будет верным. Любая строка не равна «до» или «после» (например, «до» не равна «после»).

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

if vWHEN != "before" and vWHEN != "after":
    # Here ----------^
2 голосов
/ 14 января 2020

Я подозреваю, что вы хотите изменить свою логику c на

if vWHEN != "before" and vWHEN != "after":
 exit("ERROR: " + vWHEN + " is invalid. Should be: 'before' or 'after'")

Когда вы используете or вместо and, независимо от значения vWHEN, оно всегда будет введите if тело.

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