Какова цель "а и а или б"? - PullRequest
0 голосов
/ 08 ноября 2018

Я встретил следующий код в ipython :

oname = args and args or '_'

Какой смысл в этом? Почему бы не использовать только args or '_'?

1 Ответ

0 голосов
/ 08 ноября 2018

Я предполагаю, что это удержание от древних (2.4 или более ранних) вариантов Python, где троичный оператор еще не был доступен для языка. Согласно FAQ по программированию на Python :

Есть ли эквивалент троичного оператора C??:?

Да, есть. Синтаксис выглядит следующим образом:

[on_true] if [expression] else [on_false]

x, y = 50, 25
small = x if x < y else y

До того, как этот синтаксис был представлен в Python 2.5, распространенной идиомой было использование логических операторов:

[expression] and [on_true] or [on_false]

Однако эта идиома небезопасна, так как она может давать неверные результаты, когда on_true имеет ложное логическое значение. Поэтому всегда лучше использовать форму ... если ... еще ...

Рассматриваемая строка теперь может быть записана как:

# Option 1
oname = args if args else '_'

# Option 2
oname = args or '_'

Оба дают одинаковый результат, так как в этом случае часть [expression] варианта 1 идентична части [on_true]. На мой взгляд, вариант 2 можно считать сокращенной формой варианта 1 для случаев, когда [expression] и [on_true] идентичны. Какой из них вы выберете, это личное предпочтение.

Это может дать нам подсказку о том, сколько времени прошло с тех пор, как этот код был затронут!

...