Я изо всех сил пытался найти достойный способ сделать это, поэтому я просто пришел с идеей (не серебряной пулей, так как это в основном дело вкуса).
if bool(condition1 and
condition2 and
...
conditionN):
foo()
bar()
В этом решении я нахожу несколько достоинств по сравнению с другими, которые я видел, а именно: вы получаете ровно дополнительные 4 пробела отступа (bool), позволяя всем условиям выстраиваться вертикально, а тело оператора if может быть отступом в ясной (ish) форме. Это также сохраняет преимущества оценки коротких замыканий логических операторов, но, конечно, добавляет накладные расходы при вызове функции, которая в основном ничего не делает. Вы могли бы утверждать (действительно), что любая функция, возвращающая свой аргумент, могла бы использоваться здесь вместо bool, но, как я уже сказал, это всего лишь идея, и в конечном итоге это вопрос вкуса.
Как ни странно, когда я писал это и думал о «проблеме», у меня появилась еще одна идея , которая устраняет накладные расходы при вызове функции. Почему бы не указать, что мы собираемся ввести сложное условие, используя дополнительные пары скобок? Скажем, еще 2, чтобы получить хороший 2 пробела для подусловий относительно тела оператора if. Пример:
if (((foo and
bar and
frob and
ninja_bear))):
do_stuff()
Мне отчасти это нравится, потому что, когда вы смотрите на это, в вашей голове сразу же звонит колокол, говорящий "эй, здесь происходит сложная вещь!" . Да, я знаю, что круглые скобки не помогают читабельности, но эти условия должны появляться достаточно редко, и когда они все-таки появятся, вам придется все равно остановиться и прочитать их осторожно (потому что они сложные ).
Во всяком случае, еще два предложения, которые я не видел здесь. Надеюсь, это кому-нибудь поможет:)