Альтернативная форма тернарного оператора Python

Недавно я открыл для себя альтернативу стандартной конструкции »expression_on_true if predicate else expression_on_false», которую я не встречал в справочниках:

(expression_on_false, expression_on_true)[predicate]


image

Как это работает


  1. В круглых скобках объявляется создают кортеж из двух элементов.
  2. В квадратных скобках вычисляется значение предиката.
  3. Происходит обращение к кортежу по индексу 1 (если значение предиката True) или 0 (если значение предиката False)


Разберем на примере


Допустим, у нас есть число a, и нам надо вывести «positive», если число не меньше нуля, или «nagative», если число меньше нуля.


>>> a = 101
>>> ("negative", "positive")[a >= 0]
'positive'
>>> a = -42
>>> ("negative", "positive")[a >= 0]
'negative'
>>> a = 0
>>> ("negative", "positive")[a >= 0]
"positive" if a >= 0 else "positive"
'positive'


В первом случае 101 >= 0, поэтому предикат возвращает True. При индексации True превращается в 1, поэтому обращение идет к элементу с индексом 1. Во втором случае аналогично: предикат равен False, обращение идет к элементу с индексом 0.

Конструкция («negative», «positive»)[a >= 0] хоть и не намного короче чем «positive» if a >= 0 else «positive», но я все же нахожу данную фичу интересной

Примечание


(спасибо Dasdy)
Если в кортеж вместо констант подставить выражения, из которых должно быть выполнено только одно, то данная конструкция теряет смысл.

© Habrahabr.ru