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.

5voto

Apalala Punkte 8628

Ergänzend zu dem, was @krawyoti sagte... Lange Bedingungen stinken, weil sie schwer zu lesen und schwer zu verstehen sind. Die Verwendung einer Funktion oder einer Variablen macht den Code klarer. In Python verwende ich lieber vertikale Leerzeichen, schließe Klammern ein und setze die logischen Operatoren an den Anfang jeder Zeile, damit die Ausdrücke nicht wie "fließend" aussehen.

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

Wenn die Bedingungen mehr als einmal ausgewertet werden müssen, wie bei einem while Schleife, dann ist es am besten, eine lokale Funktion zu verwenden.

5voto

ThorSummoner Punkte 13974

Schlicht und einfach, besteht auch die pep8-Prüfungen:

if (
    cond1 and
    cond2
):
    print("Hello World!")

In letzter Zeit bevorzuge ich die all y any Funktionen, da ich selten "Und"- und "Oder"-Vergleiche mische, funktioniert dies gut und hat den zusätzlichen Vorteil, dass die Generatoren früh scheitern und man sie versteht:

if all([
    cond1,
    cond2,
]):
    print("Hello World!")

Denken Sie nur daran, eine einzelne Iterable zu übergeben! Die Übergabe von N-Argumenten ist nicht korrekt.

Anmerkung: any ist wie viele or Vergleiche, all ist wie viele and Vergleiche.


Dies lässt sich z. B. gut mit Generatorenkonzepten kombinieren:

# Check if every string in a list contains a substring:
my_list = [
    'a substring is like a string', 
    'another substring'
]

if all('substring' in item for item in my_list):
   print("Hello World!")

# or

if all(
    'substring' in item
    for item in my_list
):
    print("Hello World!")

Mehr dazu: Generatorverständnis

4voto

Fred Nurk Punkte 13458

(Ich habe die Bezeichner leicht abgeändert, da Namen mit fester Breite nicht repräsentativ für echten Code sind - zumindest nicht für echten Code, dem ich begegne - und die Lesbarkeit eines Beispiels beeinträchtigen).

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4"):
    do_something

Dies funktioniert gut bei "und" und "oder" (es ist wichtig, dass sie in der zweiten Zeile an erster Stelle stehen), aber viel weniger bei anderen langen Bedingungen. Glücklicherweise scheinen erstere der häufigere Fall zu sein, während letztere oft leicht mit einer temporären Variable umgeschrieben werden können. (Es ist in der Regel nicht schwer, aber es kann schwierig oder viel weniger offensichtlich/lesbar sein, die Kurzschlüsse von "und"/"oder" beim Umschreiben zu erhalten).

Da ich diese Frage von Ihr Blogbeitrag über C++ Ich werde hinzufügen, dass mein C++-Stil identisch ist:

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4") {
    do_something
}

4voto

Marius Gedminas Punkte 10645

Ich bin überrascht, dass ich meine bevorzugte Lösung nicht sehe,

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

Desde and ein Schlüsselwort ist, wird es von meinem Editor hervorgehoben und sieht ausreichend anders aus als das darunter liegende do_something.

3voto

Anders Waldenborg Punkte 2820

"all" und "any" sind gut für die vielen Bedingungen des gleichen Typs geeignet. ABER sie werten immer alle Bedingungen aus. Wie in diesem Beispiel gezeigt:

def c1():
    print " Executed c1"
    return False
def c2():
    print " Executed c2"
    return False

print "simple and (aborts early!)"
if c1() and c2():
    pass

print

print "all (executes all :( )"
if all((c1(),c2())):
    pass

print

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