Одна из идей принципов проектирования Python "Должен быть тот... очевидный способ сделать это". (PEP 20), но это не может всегда быть верно. Я конкретно обращаюсь к (простому) если операторы по сравнению с булевой оценкой. Рассмотрите следующее:
if words:
self.words = words
else:
self.words = {}
по сравнению с
self.words = words or {}
С такой простой ситуацией, которая предпочтительна, стилистически говоря? С более сложными ситуациями можно было бы выбрать если оператор для удобочитаемости, правильно?
«Там должен быть только один» вполне может всегда быть правдой; это положительное утверждение «там есть только одно», которое не может быть - «должен» подразумевает цель, цель, а не возможность всегда ее достичь (например, для чисел a
и b
, запрещающий либо b + a
, либо a + b
, было бы настолько абсурдным, что в этом случае просто не может быть разумно «только один путь»).
В вашем примере я бы согласился с тем, что или
предпочтительнее в достаточно простых случаях (четыре строки для выполнения того, что можно сделать в одной четкой и читаемой строке, - это пустая трата вертикального пространства), но не для предикат любой значительной сложности. Решение о том, что имеет «значительную сложность», конечно, требует суждения.
В этом случае я бы сказал: "Явное лучше неявного".
Когда кто-то читает ваш код, он может сделать несколько предположений. Они могут предположить, что "слова" могут быть либо пустым диктом, либо диктом с данными (пропуская случай, когда это None). В этом случае у них может возникнуть соблазн оптимизировать ваш код. Возможно, они даже будут правы, если нигде не указано, что вы можете получить значение None.
Если "слова" на самом деле могут быть None, я бы попытался уточнить это с помощью:
self.words = words
if words is None:
self.words = {}
Или, возможно, "else" вместо безусловного присвоения первым. В любом случае, таким образом вы как бы документируете тот факт, что None является ожидаемым значением для "words".
(Edited)
ну в таком случае, как ниже, я голосую за условное выражение
def somesuch(self, words=None):
self.words = words or {}
...
конечно, если вы думаете, что это улучшит читабельность (вы можете прочитать это вслух?), вы можете попробовать
self.words = words if words else {}