876 Stimmen

Stilisierung von mehrzeiligen Bedingungen in 'if'-Anweisungen?

Manchmal breche ich lange Bedingungen in if s auf mehrere Zeilen. Der naheliegendste Weg, dies zu tun, ist:

  if (cond1 == 'val1' and cond2 == 'val2' and
      cond3 == 'val3' and cond4 == 'val4'):
      do_something

Das ist optisch nicht sehr ansprechend, weil die Aktion mit den Bedingungen verschmilzt. Es ist jedoch die natürliche Art und Weise, die korrekte Python-Einrückung von 4 Leerzeichen zu verwenden.

Im Moment benutze ich:

  if (    cond1 == 'val1' and cond2 == 'val2' and
          cond3 == 'val3' and cond4 == 'val4'):
      do_something

Aber das ist nicht sehr hübsch :-)

Können Sie einen alternativen Weg empfehlen?

2 Stimmen

Wenn Ihr Editor die Funktion Pep8 Python-Paket, um zu erkennen, wann eine Warnung über PEP8 Verstöße, müssen Sie entweder den E125-Fehler deaktivieren oder eine Formatierungslösung finden, die den Anforderungen der pep8 Kriterien des Pakets. Die Website pep8 des Pakets Ausgabe #126 geht es darum, das Paket strikt an die PEP8-Spezifikation anzupassen. Die Diskussion zu diesem Thema enthält einige Stilvorschläge, die auch hier zu sehen sind.

1 Stimmen

Beachten Sie, dass pep8 für das erste Beispiel "E129 visuell eingerückte Zeile mit gleichem Einzug wie die nächste logische Zeile" ausgibt.

0 Stimmen

Diese Frage ist sehr alt und es gibt eine Menge Meinungen, aber sie ist eindeutig meinungsbasiert. Die Formulierungen "ist nicht sehr ansprechend" und "ist nicht sehr hübsch" legen die Kriterien dafür fest, dass die vermeintlich richtige Antwort diejenige ist, die am besten mit den ästhetischen Vorlieben des Fragestellers übereinstimmt (d. h. eine Meinung). Ich könnte genau dieselbe Frage stellen und behaupten, dass es sich nicht um ein Duplikat handelt, weil mein ästhetischer Geschmack sie als anders qualifiziert und zu einer anderen "richtigen" Antwort führen wird.

980voto

Harley Holcombe Punkte 165146

Sie brauchen keine 4 Leerzeichen in der zweiten Bedingungszeile zu verwenden. Verwenden Sie vielleicht:

if (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

Vergessen Sie auch nicht, dass der Leerraum flexibler ist, als Sie vielleicht denken:

if (   
       cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something
if    (cond1 == 'val1' and cond2 == 'val2' and 
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

Beide sind allerdings ziemlich hässlich.

Vielleicht sollten Sie die Klammern (die Stil-Leitfaden entmutigt dies jedoch)?

if cond1 == 'val1' and cond2 == 'val2' and \
   cond3 == 'val3' and cond4 == 'val4':
    do_something

So können Sie zumindest eine gewisse Differenzierung vornehmen.

Oder sogar:

if cond1 == 'val1' and cond2 == 'val2' and \
                       cond3 == 'val3' and \
                       cond4 == 'val4':
    do_something

Ich glaube, ich bevorzuge:

if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something

Hier ist die Stil-Leitfaden , die (seit 2010) die Verwendung von Klammern empfiehlt.

146voto

S.Lott Punkte 371691

Für den degenerierten Fall, dass es sich um einfache UND- oder ODER-Verknüpfungen handelt, habe ich auf Folgendes zurückgegriffen.

if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

Sie rasiert ein paar Charaktere und macht deutlich, dass es keine Subtilität in Bezug auf den Zustand gibt.

75voto

Deestan Punkte 15779

Ich bevorzuge diesen Stil, wenn ich eine schrecklich große Bedingung habe:

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status=="HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()

67voto

Kevin Little Punkte 11796

Jemand muss sich hier für die Verwendung des vertikalen Leerzeichens einsetzen! :)

if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()

Dadurch wird jeder Zustand deutlich sichtbar. Außerdem können so komplexere Bedingungen sauberer ausgedrückt werden:

if (    cond1 == val1
     or 
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()

Ja, wir tauschen ein wenig vertikalen Platz gegen Übersichtlichkeit. Das ist es aber wert, IMO.

30voto

Federico A. Ramponi Punkte 44697

Das macht nicht so viel besser, aber...

allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and
                 cond3 == 'val3' and cond4 == 'val4')

if allCondsAreOK:
   do_something

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X