Was ist der richtige Weg, um ein mehrzeiliges Diktat in Python zu formatieren?


182

In Python möchte ich ein mehrzeiliges Diktat in meinen Code schreiben. Es gibt verschiedene Möglichkeiten, wie man es formatieren kann. Hier sind einige, an die ich denken könnte:

  1. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3, }
  2. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3,
             }
  3. mydict = {
        "key1": 1,
        "key2": 2,
        "key3": 3,
    }

Ich weiß, dass einer der oben genannten Punkte syntaktisch korrekt ist, aber ich gehe davon aus, dass es für Python-Diktate einen bevorzugten Einrückungs- und Zeilenumbruchstil gibt. Was ist es?

Hinweis: Dies ist kein Problem der Syntax. Alle oben genannten sind (soweit ich weiß) gültige Python-Anweisungen und entsprechen einander.


12
Für 1 und 2: Keine Leerzeichen direkt innerhalb der Klammern, siehe PEP 8.
Sven Marnach

3
Ich möchte sagen, dass im Python-Pprint-Modul Ihr erstes Beispiel verwendet wird, ohne Leerzeichen direkt in den geschweiften Klammern.
CharmoniumQ

Antworten:


237

Ich benutze # 3. Gleiches gilt für lange Listen, Tupel usw. Es müssen keine zusätzlichen Leerzeichen über die Einrückungen hinaus hinzugefügt werden. Sei wie immer konsequent.

mydict = {
    "key1": 1,
    "key2": 2,
    "key3": 3,
}

mylist = [
    (1, 'hello'),
    (2, 'world'),
]

nested = {
    a: [
        (1, 'a'),
        (2, 'b'),
    ],
    b: [
        (3, 'c'),
        (4, 'd'),
    ],
}

In ähnlicher Weise ist hier meine bevorzugte Methode, große Zeichenfolgen ohne Leerzeichen einzufügen (wie Sie es erhalten würden, wenn Sie mehrzeilige Zeichenfolgen mit dreifachen Anführungszeichen verwenden würden):

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)

Könnten Sie einen Verweis hinzufügen, ich habe Probleme, eine maßgebliche Quelle dafür zu finden. (Ich stimme dir zu).
Trufa

82
Hmm, ich habe folgendes gefunden: stackoverflow.com/questions/6388187/…
FogleBird

6
Sagen Sie ihm nicht, aber dieser Benutzer hat keine Ahnung, wovon er spricht; P
Trufa

3
lol, im Ernst, ich konnte auch keine "maßgebliche" Referenz finden. Ich werde dich wissen lassen, wenn ich es tue! Vielleicht sollte sich jemand an Guido wenden.
FogleBird

2
Dies entspricht PEP 8: python.org/dev/peps/pep-0008/#indentation . Am Ende des Abschnitts über Einrückungen finden Sie einige Listenbeispiele.
Ams

30

Zunächst sagte Steven Rumbalski, "PEP8 geht diese Frage nicht an", daher ist es eine Frage der persönlichen Präferenz.

Ich würde ein ähnliches, aber nicht identisches Format wie Ihr Format 3 verwenden. Hier ist meins und warum.

my_dictionary = { # Don't think dict(...) notation has more readability
    "key1": 1, # Indent by one press of TAB (i.e. 4 spaces)
    "key2": 2, # Same indentation scale as above
    "key3": 3, # Keep this final comma, so that future addition won't show up as 2-lines change in code diff
    } # My favorite: SAME indentation AS ABOVE, to emphasize this bracket is still part of the above code block!
the_next_line_of_code() # Otherwise the previous line would look like the begin of this part of code

bad_example = {
               "foo": "bar", # Don't do this. Unnecessary indentation wastes screen space
               "hello": "world" # Don't do this. Omitting the comma is not good.
} # You see? This line visually "joins" the next line when in a glance
the_next_line_of_code()

btw_this_is_a_function_with_long_name_or_with_lots_of_parameters(
    foo='hello world',  # So I put one parameter per line
    bar=123,  # And yeah, this extra comma here is harmless too;
              # I bet not many people knew/tried this.
              # Oh did I just show you how to write
              # multiple-line inline comment here?
              # Basically, same indentation forms a natural paragraph.
    ) # Indentation here. Same idea as the long dict case.
the_next_line_of_code()

# By the way, now you see how I prefer inline comment to document the very line.
# I think this inline style is more compact.
# Otherwise you will need extra blank line to split the comment and its code from others.

some_normal_code()

# hi this function is blah blah
some_code_need_extra_explanation()

some_normal_code()

Ich mag den Inline-Kommentar. Mein erster Programmierprofessor (ich hatte schon vor Jahren programmiert) bestand auf Inline-Kommentaren, erklärte aber nie effektiv, warum. Sie haben jetzt eine Praxis erklärt, die ich seit ungefähr 20 Jahren verwende.
Joshua K

Aha, danke. Wir haben ein ähnliches Alter, Erfahrung und "Kilometerstand" in Bezug auf die Programmierung. Wenn Sie also bereits vor 20 Jahren mit dieser Inline-Kommentarpraxis begonnen haben (was beeindruckend ist!), Warum brauchten Sie die Erklärung Ihres Professors noch vor vermutlich 10 Jahren, als Sie an Ihrer Universität waren? Nur neugierig. :-)
RayLuo

sehr gute Frage :) ATARI BASIC und GWbasic haben es praktisch erzwungen, da es sich um Compiler handelt, die auf Top-Down-Flow-Linien basieren. Es ist etwas, das ich übernommen habe, als ich Peter Nortons BASIC (und später ASM-Code) in Papiermagazinen las. Zwischendurch habe ich Turbo Pascal gelernt, aber ich hatte bereits aus den Beispielen in den Papiermagazinen gelernt und mich an die Einschränkungen von BASIC gehalten.
Joshua K

PEP8 spricht dies etwas an, da empfohlen wird, unmittelbar nach einer öffnenden Klammer kein Leerzeichen hinzuzufügen, sodass die Optionen 1 und 2 in OP nicht verfügbar sind.
Daniel Serodio

9

Da Ihre Schlüssel Zeichenfolgen sind und wir über Lesbarkeit sprechen, bevorzuge ich:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)

6
Verwenden Sie beim Definieren von kwargs keine Leerzeichen. c = function(a=1, b=2)ist mehr "pythonisch".
Steve K


0
dict(rank = int(lst[0]),
                grade = str(lst[1]),
                channel=str(lst[2])),
                videos = float(lst[3].replace(",", " ")),
                subscribers = float(lst[4].replace(",", "")),
                views = float(lst[5].replace(",", "")))

Dies beantwortet die Frage nicht
Bagerard

-1

Aus meiner Erfahrung mit Tutorials und anderen Dingen scheint Nummer 2 immer bevorzugt zu sein, aber es ist mehr als alles andere eine persönliche Präferenzwahl.


-6

Im Allgemeinen würden Sie das Komma nach dem endgültigen Eintrag nicht einfügen, aber Python korrigiert dies für Sie.


34
Nein! Fügen Sie immer das letzte Komma ein. Wenn Sie also ein neues letztes Element hinzufügen, müssen Sie die Zeile davor nicht ändern. Dies ist eines der großartigen Dinge an Python: Praktikabilität über Reinheit.
Ned Batchelder

2
Darüber hinaus wird in dieser Antwort die gestellte Frage nicht beantwortet.
RKD314
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.