В частности,
self.maxTiles if self.maxTiles is not None else (2, 2)
Я обнаружил, что "двойные отрицания" общего вида if not A: B else: C
(как в выражениях, так и в выражениях) могут быть весьма запутанными / вводящими в заблуждение;это не буквально if not .. else
, но перемещение not
не устраняет «двойной негатив».
Итак, в общем, я просто переписываю такие конструкции в if A: C else: B
.В этом конкретном случае, если бы я выбрал форму троичного оператора, я бы закодировал ее как
(2, 2) if self.maxTiles is None else self.maxTiles
По более общему вопросу: a = b or c
хорошо тогда и только тогда, когда вы действительно хотите использовать c
для любое ложное значение b
- это не хорошо, чтобы иметь дело конкретно с b
, являющимся None
.IOW, b or c
- лучший способ выразить
b if b else c
, но это , а не способ выразить подобное выражение, где основной тест вместо этого, b is None
.Теоретически, если вы «знаете», что единственное возможное ложное значение для b
- это None
, они семантически эквивалентны, но это сильное ограничение «только возможное ложное значение» не будет очевидным для читателей / сопровождающих вашего кода- и если вам нужно добавить комментарий, объясняющий это, любые преимущества краткости, которые or
может заявить, аннулируются ... лучше, когда это возможно, "сказать это в коде", а не делать код неясным и нужнымкомментарии, чтобы уточнить, что именно он делает и когда (действительно полезные комментарии - это скорее те, которые объясняют, а не что и когда [[сам код должен показывать это! -)]], а скорее почему когда не очевидно - какова цель приложения, обслуживаемая этим конкретным кусочком функциональности кода).