Что я узнал:
В разделе Погружение в Python я читал об особой природе операторов and
и or
и о том, как можно использовать упрощенную оценку логических операторов для более краткого выражения условных выражений с помощью и/или трюк, который очень похож на тернарный оператор в C.
С:
result = condition ? a : b
Питон:
result = condition and a or b
Это кажется удобным, поскольку лямбда-функции в Python ограничены однострочными строками, но для выражения потока управления используется логический синтаксис.
Начиная с Python 2.5, inline-if
, кажется, пришел на помощь как более читаемый синтаксис для трюка and/or:
result = a if condition else b
Итак, я предполагаю, что это питоническая замена менее читаемой и-или-конструкции. Даже если я хочу вложить несколько условий, это все равно выглядит довольно исчерпывающе:
result = a if condition1 else b if condition2 else c
Но в мире неопределенности я часто пишу такой код для доступа к a.b.c :
result = a and hasattr(a, 'b') and hasattr(a.b, 'c') and a.b.c or None
Таким образом, с помощью inline-if я, вероятно, мог бы избавиться от некоторых и и или, в результате чего получился вполне читаемый фрагмент кода:
result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None
Я также обнаружил несколько загадочный подход к условным обозначениям в этом рецепте.
result = (a, b)[condition]
но это не приводит к короткому замыканию и приведет к всевозможным ошибкам, если результат условия не возвращает логическое значение, 0 или 1.
Что я хотел бы знать:
Теперь мне интересно, считается ли предпочтительным / более питоническим использовать встроенный-if
как можно больше, если нисходящая совместимость не вызывает беспокойства, или это всего лишь вопрос вкуса и насколько человек чувствует себя как дома в мире коротких- оценка цепи?
Обновлять
Я только что понял, что inline-if - это больше, чем синтаксический сахар для трюка и-или, поскольку он не подведет, когда a
будет ложным в логическом контексте. Так что это, вероятно, более отказоустойчиво.