Eu também tenho lutado para encontrar uma maneira decente de fazer isso, então tive uma idéia (não uma bala de prata, já que isso é principalmente uma questão de gosto).
if bool(condition1 and
condition2 and
...
conditionN):
foo()
bar()
Encontro alguns méritos nessa solução em comparação com outros que já vi, ou seja, você obtém exatamente 4 espaços extras de recuo (bool), permitindo que todas as condições se alinhem verticalmente, e o corpo da instrução if pode ser recuado uma maneira clara (ish). Isso também mantém os benefícios da avaliação de curto-circuito de operadores booleanos, mas é claro que adiciona a sobrecarga de uma chamada de função que basicamente não faz nada. Você poderia argumentar (validamente) que qualquer função retornando seu argumento poderia ser usada aqui em vez de bool, mas, como eu disse, é apenas uma ideia e, em última análise, é uma questão de gosto.
Engraçado o bastante, enquanto escrevia isso e pensava no "problema", tive outra idéia, que remove a sobrecarga de uma chamada de função. Por que não indicar que estamos prestes a entrar em uma condição complexa usando pares extras de parênteses? Diga mais 2, para dar um bom recuo de 2 espaços nas sub-condições em relação ao corpo da instrução if. Exemplo:
if (((foo and
bar and
frob and
ninja_bear))):
do_stuff()
Eu meio que gosto disso porque quando você olha para ele, um sino toca imediatamente em sua cabeça dizendo "ei, há uma coisa complexa acontecendo aqui!" . Sim, eu sei que parênteses não ajudam na legibilidade, mas essas condições devem aparecer raramente o suficiente, e quando elas aparecerem, você precisará parar e lê-las com cuidado de qualquer maneira (porque são complexas ).
Enfim, apenas mais duas propostas que não vi aqui. Espero que isso ajude alguém :)
pep8
critérios do pacote. Opep8
do pacote de edição # 126 é sobre a fixação do pacote de seguir rigorosamente a especificação PEP8. A discussão para a edição inclui algumas sugestões de estilo também vistas aqui.