логические операторы, заменяющие операторы if

совместимы ли следующие логические выражения Pythonic / pep8?

  1. это:

    x = a or b
    

    вместо:

    if not a:
        x = b
    else:
        x = a
    
  2. это:

    x = a and b
    

    вместо:

    if not a:
        x = a
    else:
        x = b
    
  3. (кривой шар?) Это:

    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 не имеет ничего общего с тем, как вы использовать ваши логические операторы.

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

  1. x = a if a else b вместо x = a or b

  2. x = b if a else a вместо x = a and b

  3. 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. из-за того, что он более читаемый и менее склонный к разрыву.