Альтернативная форма тернарного оператора Python
Недавно я открыл для себя альтернативу стандартной конструкции »expression_on_true if predicate else expression_on_false», которую я не встречал в справочниках:
(expression_on_false, expression_on_true)[predicate]
Как это работает
- В круглых скобках объявляется создают кортеж из двух элементов.
- В квадратных скобках вычисляется значение предиката.
- Происходит обращение к кортежу по индексу 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)
Если в кортеж вместо констант подставить выражения, из которых должно быть выполнено только одно, то данная конструкция теряет смысл.