Стиль Python: если операторы по сравнению с булевой оценкой

Одна из идей принципов проектирования Python "Должен быть тот... очевидный способ сделать это". (PEP 20), но это не может всегда быть верно. Я конкретно обращаюсь к (простому) если операторы по сравнению с булевой оценкой. Рассмотрите следующее:

if words:
    self.words = words
else:
    self.words = {}

по сравнению с

self.words = words or {}

С такой простой ситуацией, которая предпочтительна, стилистически говоря? С более сложными ситуациями можно было бы выбрать если оператор для удобочитаемости, правильно?

7
задан Mike Craig 10 June 2010 в 05:05
поделиться

3 ответа

«Там должен быть только один» вполне может всегда быть правдой; это положительное утверждение «там есть только одно», которое не может быть - «должен» подразумевает цель, цель, а не возможность всегда ее достичь (например, для чисел a и b , запрещающий либо b + a , либо a + b , было бы настолько абсурдным, что в этом случае просто не может быть разумно «только один путь»).

В вашем примере я бы согласился с тем, что или предпочтительнее в достаточно простых случаях (четыре строки для выполнения того, что можно сделать в одной четкой и читаемой строке, - это пустая трата вертикального пространства), но не для предикат любой значительной сложности. Решение о том, что имеет «значительную сложность», конечно, требует суждения.

9
ответ дан 6 December 2019 в 23:01
поделиться

В этом случае я бы сказал: "Явное лучше неявного".

Когда кто-то читает ваш код, он может сделать несколько предположений. Они могут предположить, что "слова" могут быть либо пустым диктом, либо диктом с данными (пропуская случай, когда это None). В этом случае у них может возникнуть соблазн оптимизировать ваш код. Возможно, они даже будут правы, если нигде не указано, что вы можете получить значение None.

Если "слова" на самом деле могут быть None, я бы попытался уточнить это с помощью:

self.words = words
if words is None:
    self.words = {}

Или, возможно, "else" вместо безусловного присвоения первым. В любом случае, таким образом вы как бы документируете тот факт, что None является ожидаемым значением для "words".

2
ответ дан 6 December 2019 в 23:01
поделиться

(Edited)
ну в таком случае, как ниже, я голосую за условное выражение

def somesuch(self, words=None):
    self.words = words or {}
    ...

конечно, если вы думаете, что это улучшит читабельность (вы можете прочитать это вслух?), вы можете попробовать

self.words = words if words else {}
0
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: