1367 Stimmen

Wie kann ich in Python einen Zeilenumbruch (Zeilenfortsetzung) vornehmen?

Gegeben:

e = 'a' + 'b' + 'c' + 'd'

Wie schreibe ich das obige in zwei Zeilen?

e = 'a' + 'b' +
    'c' + 'd'

1538voto

Harley Holcombe Punkte 165146

Was ist die Grenze? Sie können ohne Probleme Argumente in der nächsten Zeile angeben:

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

Ansonsten können Sie so vorgehen:

if (a == True and
    b == False):

oder mit ausdrücklichem Zeilenumbruch:

if a == True and \
   b == False:

Prüfen Sie die Styleguide für weitere Informationen.

Wenn Sie Klammern verwenden, kann Ihr Beispiel über mehrere Zeilen geschrieben werden:

a = ('1' + '2' + '3' +
    '4' + '5')

Der gleiche Effekt kann mit einem expliziten Zeilenumbruch erzielt werden:

a = '1' + '2' + '3' + \
    '4' + '5'

Beachten Sie, dass der Styleguide besagt, dass die implizite Fortsetzung mit Klammern zu bevorzugen ist, aber in diesem speziellen Fall ist das Hinzufügen von Klammern um Ihren Ausdruck wahrscheinlich der falsche Weg.

50 Stimmen

Eigentlich haben Sie die Präferenz des Styleguides genau falsch herum. Eine implizite Fortsetzung wird bevorzugt, ein expliziter Backslash soll nur verwendet werden, wenn es nötig ist.

0 Stimmen

Ich glaube, er will damit sagen, dass Sie, wenn Sie bereits Klammern um einen Ausdruck haben, diese verwenden sollten, aber keine Klammern um einen Ausdruck setzen sollten, nur um ihn über mehrere Zeilen zu verteilen. Das ist aber keine feste Regel. Ich denke, für die Zeile in der Frage ist ein Backslash der richtige Weg.

0 Stimmen

Das ist nicht richtig. Bitte ändern Sie Ihre Antwort so ab, dass sie das wiedergibt, was der Style Guide tatsächlich sagt, anstatt das Gegenteil zu behaupten.

306voto

jfs Punkte 370717

Desde PEP 8 -- Style Guide für Python-Code :

Die bevorzugte Art, lange Zeilen umzubrechen, ist die Verwendung von Pythons impliziter Zeilenfortsetzung innerhalb von Klammern, eckigen Klammern und geschweiften Klammern. Lange Zeilen können auf mehrere Zeilen aufgeteilt werden, indem Ausdrücke in Klammern gesetzt werden. Diese sollten der Verwendung eines Backslashs für die Zeilenfortsetzung vorgezogen werden.

Backslashes können gelegentlich noch angebracht sein. Zum Beispiel können lange, mehrfache with-Anweisungen keine implizite Fortsetzung verwenden, so dass Backslashes akzeptabel sind:

with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
     file_2.write(file_1.read())

Ein weiterer solcher Fall sind assert-Anweisungen.

Achten Sie darauf, die fortgesetzte Zeile entsprechend einzurücken. Die bevorzugte Stelle für einen Zeilenumbruch um einen binären Operator ist nach dem Betreiber, nicht vor ihm. Einige Beispiele:

class Rectangle(Blob):

  def __init__(self, width, height,
                color='black', emphasis=None, highlight=0):
       if (width == 0 and height == 0 and
          color == 'red' and emphasis == 'strong' or
           highlight > 100):
           raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                          emphasis is None):
           raise ValueError("I don't think so -- values are %s, %s" %
                            (width, height))
       Blob.__init__(self, width, height,
                     color, emphasis, highlight)file_2.write(file_1.read())

PEP8 empfiehlt nun die entgegengesetzte Konvention (zur Unterbrechung von Binäroperationen), die von Mathematikern und ihren Verlagen zur Verbesserung der Lesbarkeit verwendet werden.

Donald Knuths Stil des Brechens avant Ein binärer Operator richtet die Operatoren vertikal aus und entlastet so das Auge, wenn es feststellt, welche Elemente addiert und subtrahiert werden.

Desde PEP8: Soll ein Zeilenumbruch vor oder nach einem binären Operator erfolgen? :

Donald Knuth erklärt die traditionelle Regel in seiner Reihe Computer und Schriftsatz: "Obwohl Formeln innerhalb eines Absatzes immer nach binären Operationen und Beziehungen umbrechen, brechen angezeigte Formeln immer vor binären Operationen um"[3].

Wenn man der Tradition der Mathematik folgt, wird der Code in der Regel besser lesbar:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

In Python-Code ist es zulässig, vor oder nach einem binären Operator zu brechen, solange die Konvention lokal konsistent ist. Für neuen Code wird Knuths Stil empfohlen.

[3]: Donald Knuths The TeXBook, Seiten 195 und 196

4 Stimmen

NB: Die Empfehlung wurde 2010 geändert: "Lange Zeilen können umbrochen werden ... indem Ausdrücke in Klammern gesetzt werden. Diese sollten der Verwendung eines Backslashs vorgezogen werden...", und alle Backslashs wurden aus dem Codebeispiel entfernt.

1 Stimmen

@e100: Lesen Sie den fettgedruckten Text oben: The preferred way .. is by using Python's implied line continuation inside parentheses ist es dasselbe wie by wrapping expressions in parentheses . Ich habe das Beispiel aktualisiert

10 Stimmen

Aber beachten Sie, dass "manchmal sieht ein Backslash besser aus" auch verschwunden ist.

89voto

George V. Reilly Punkte 14862

Die Gefahr bei der Verwendung eines Backslashs am Ende einer Zeile besteht darin, dass der Backslash nicht mehr das tut, wofür er gedacht war, wenn nach dem Backslash ein Leerzeichen eingefügt wird (was natürlich sehr schwer zu sehen ist).

Siehe Python-Idiome und Anti-Idiome (für Python 2 o Python 3 ) für mehr.

12 Stimmen

Dies ist ein Grund dafür, dass es schön ist, Leerzeichen am Ende besser zu sehen; z. B. etwas wie set list listchars=trail:· in vim. :)

1 Stimmen

Das gilt nicht nur für das Leerzeichen nach dem Backslash. Der Backslash sollte unbedingt das letzte Zeichen in der Zeile sein. Insbesondere können Sie bestimmte Begriffe in einer Summe nicht kommentieren, indem Sie die Zeile mit einem Backslash unterbrechen und einen Kommentar dahinter setzen. Klammern funktionieren gut! :)

0 Stimmen

Es ist schade, dass diese Erklärung aus der Dokumentation (nach 3.1) verschwunden ist. In PEP8 wird die Begründung nicht erklärt.

41voto

SCdF Punkte 53953

Setzen Sie eine \ am Ende der Zeile oder schließen Sie die Anweisung in Klammern ein ( .. ) . Von IBM :

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

または

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)

30voto

Konrad Rudolph Punkte 503837

Sie können Zeilen zwischen Klammern und geschweiften Klammern umbrechen. Außerdem können Sie das Backslash-Zeichen anhängen \ an eine Zeile, um sie explizit zu unterbrechen:

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

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