логические операторы, заменяющие операторы if
совместимы ли следующие логические выражения Pythonic / pep8?
-
это:
x = a or b
вместо:
if not a: x = b else: x = a
-
это:
x = a and b
вместо:
if not a: x = a else: x = b
-
(кривой шар?) Это:
x = x or y
вместо:
if not x: x = y
3 ответов
В отличие от C и Java, логические операторы Python не возвращают логические значения. Я не могу представить другой вариант использования этой языковой функции, кроме того, в вашем вопросе, поэтому, если языковые дизайнеры не добавляют функции бездумно, это Pythonic (за исключением #3).
есть много случаев, когда короткое замыкание логично или может быть использовано в ваших интересах. Вот простой из исходного кода запросы:
cookies = request.cookies or {}
это сразу очевидно, каким должен быть результат этого кода, поскольку он читается как предложение. Теперь это не значит, что подробные версии не читаются:
cookies = request.cookies if request.cookies else {}
и:
cookies = {}
if request.cookies:
cookies = request.cookies
но они избыточны. Python использует тот же синтаксис для словарей, чтобы предотвратить такую же избыточность:
d.get('key', 'fallback')
PEP 8 не имеет ничего общего с тем, как вы использовать ваши логические операторы.
предполагая, что мотивацией для использования логических операторов вместо условных является краткость, то это лучше выполнить с помощью тернарного оператора:
x = a if a else b
вместоx = a or b
x = b if a else a
вместоx = a and b
x = x if x else y
или простоif not x: x = y
вместоx = x or y
но никто не запрещает вам использовать и другие версии. Это все метр личного мнения. Мотивация введения троичного оператора заключалась в том, чтобы избежать подверженных ошибкам попыток достичь того же эффекта с помощью and
и or
операторов (см. PEP 308). Они также позволяют причудливые вещи в понимании списка и еще несколько вещей.
они не вводятся для замены сложных операторов if, но как весть тернарный оператор: x if condition else y
.
Я не думаю, что pep8 охватывает, но для меня, в ваших примерах if
операторы выглядят более читаемыми (особенно для людей, новых для Python (и, следовательно, более Питоническими из-за "считываемости"), чем логические операторы, которые все еще выглядят более Питоническими, чем тернарные операторы.
однако, троичные операторы определенно лучше, чем condition and true_value or false_value
, (false_value, true_value)[condition]
etc. из-за того, что он более читаемый и менее склонный к разрыву.