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.

3voto

ryanjdillon Punkte 15461

Ich denke, dass die Lösung von @zkanda mit einer kleinen Abwandlung gut wäre. Wenn Sie Ihre Bedingungen und Werte in ihre eigenen jeweiligen Listen hatten, könnten Sie eine Liste Verständnis verwenden, um den Vergleich zu tun, die Dinge ein bisschen mehr allgemein für das Hinzufügen von Bedingung/Wert-Paare machen würde.

conditions = [1, 2, 3, 4]
values = [1, 2, 3, 4]
if all([c==v for c, v in zip(conditions, values)]):
    # do something

Wenn ich eine solche Anweisung hart kodieren wollte, würde ich sie aus Gründen der Lesbarkeit so schreiben:

if (condition1==value1) and (condition2==value2) and \
   (condition3==value3) and (condition4==value4):

Und um eine weitere Lösung mit einer iand Betreiber :

proceed = True
for c, v in zip(conditions, values):
    proceed &= c==v

if proceed:
    # do something

2voto

Federico A. Ramponi Punkte 44697

Wie wäre es, wenn wir nur eine zusätzliche Leerzeile zwischen der Bedingung und dem Textkörper einfügen und den Rest auf die kanonische Weise erledigen?

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

    do_something

p.s. Ich verwende immer Tabulatoren, keine Leerzeichen; ich kann keine Feinabstimmung vornehmen...

2voto

Stof Punkte 394

Alle Befragten, die auch Multibedingungen für die if-Anweisung bereitstellen, sind genauso hässlich wie das vorgestellte Problem. Man löst dieses Problem nicht, indem man das Gleiche tut

Auch die Antwort PEP 0008 ist abstoßend.

Hier ist ein weitaus besser lesbarer Ansatz

condition = random.randint(0, 100) # to demonstrate
anti_conditions = [42, 67, 12]
if condition not in anti_conditions:
    pass

Soll ich an meinen Worten ersticken? Überzeugen Sie mich, dass Sie Multikonditionale brauchen, und ich werde dies zu Ihrer Belustigung ausdrucken und essen.

2voto

SMGreenfield Punkte 1611

Ich weiß, dieser Thread ist alt, aber ich habe einige Python 2.7-Code und PyCharm (4.5) beschwert sich noch über diesen Fall:

if foo is not None:
    if (cond1 == 'val1' and cond2 == 'val2' and
        cond3 == 'val3' and cond4 == 'val4'):
            # some comment about do_something
            do_something

Selbst mit der PEP8-Warnung "visuell eingerückte Zeile mit gleichem Einzug wie die nächste logische Zeile" ist der eigentliche Code völlig in Ordnung? Er ist nicht "übermäßig eingerückt"?

...es gibt Zeiten, in denen ich mir wünschte, Python hätte in den sauren Apfel gebissen und einfach geschweifte Klammern verwendet. Ich frage mich, wie viele Bugs im Laufe der Jahre versehentlich durch falsche Einrückungen eingeführt wurden...

2voto

tomekwi Punkte 1868

Normalerweise mache ich das so:

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

Auf diese Weise markieren die schließende Klammer und der Doppelpunkt visuell das Ende unserer Bedingung.

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