Was ist die bevorzugte Syntax zum Initialisieren eines Diktats: Literale in geschweiften Klammern {} oder die Funktion dict()?

Lesezeit: 5 Minuten

Benutzer-Avatar
daotoad

Ich bemühe mich, Python zu lernen, und achte genau auf gängige Programmierstandards. Dies mag wie eine sinnlos pingelig erscheinende Frage erscheinen, aber ich versuche, mich beim Lernen auf Best Practices zu konzentrieren, damit ich später keine „schlechten“ Angewohnheiten verlernen muss.

Ich sehe zwei gängige Methoden zum Initialisieren eines Diktats:

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a="value",
    another="value",
)

Was gilt als “pythonischer”? Welche verwendest du? Wieso den?

  • Welches Lernprogramm verwendest du? Wo haben Sie Beispiele gesehen, die zu Verwirrung führten?

    – S. Lott

    18. Mai 2010 um 2:41 Uhr

  • Nun, ich habe das Python-Tutorial, Dive into Python und dann eine Vielzahl von Blogs, SO-Posts und andere gegoogelte Ressourcen verwendet. Die offizielle Dokumentation verwenden {} ziemlich einheitlich, aber ich sehe viel explizites dict() woanders ansetzen. Ich konnte den Vorteil einer expliziten Syntax sehen, aber das Fehlen des Ansatzes in den offiziellen Dokumenten machte mich misstrauisch. Nachdem ich dies gepostet hatte, sah ich mir die Bibliotheksdokumentation an dict und fand die Warnung, dass Schlüssel gültige Bezeichner sein müssen, wenn eine explizite dict wird verwendet, um ein Diktat zu initialisieren.

    – Daotoad

    18. Mai 2010 um 4:35 Uhr

  • Wie ist “dict()” expliziter als “{}”? Ich verstehe deine Verwirrung nicht. Beides erscheint mir eindeutig. Können Sie ein Zitat oder eine Referenz angeben, die Sie sagen lässt, dass „dict“ „explizit“ und „{}“ nicht explizit ist? Woher kommt diese Unterscheidung Ihrer Meinung nach?

    – S. Lott

    18. Mai 2010 um 11:19 Uhr

  • Der Unterschied liegt in der Rechtschreibung. dict() buchstabiert ist dict–es verwendet den Namen des Typs. Die Hosenträger ({}) verlassen sich auf Interpunktion, um den Typ zu identifizieren.

    – Daotoad

    18. Mai 2010 um 15:14 Uhr

Benutzer-Avatar
Wai Yip Tung

Geschweifte Klammern. Übergeben von Schlüsselwortargumenten in dict()obwohl es in vielen Szenarien wunderbar funktioniert, kann eine Karte nur initialisieren, wenn die Schlüssel gültige Python-Bezeichner sind.

Das funktioniert:

a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})

Das wird nicht funktionieren:

a = dict(import="trade", 1=7.8)

Es wird zu folgendem Fehler führen:

    a = dict(import="trade", 1=7.8)
             ^
SyntaxError: invalid syntax

Die ersten, geschweiften Klammern. Andernfalls treten Konsistenzprobleme mit Schlüsseln auf, die ungerade Zeichen enthalten, wie z =.

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a="value",
    b=c="value",
)

  • Genau aus diesem Grund könnte man die dict()-Methode für die Initialisierung bevorzugen, sie erzwingt, dass die Wörterbuchschlüssel gültige Bezeichner sind, sodass sie beispielsweise mit **kwargs kompatibel sind, und Schlüssel sind gültige Attributnamen.

    – RufusVS

    10. August 2016 um 15:57 Uhr

Benutzer-Avatar
stephan

Die erste Version ist vorzuziehen:

  • Es funktioniert für alle Arten von Schlüsseln, so kann man zum Beispiel sagen {1: 'one', 2: 'two'}. Die zweite Variante funktioniert nur für (einige) Zeichenfolgenschlüssel. Die Verwendung verschiedener Arten von Syntax in Abhängigkeit von der Art der Schlüssel wäre eine unnötige Inkonsistenz.
  • Es ist schneller:

    $ python -m timeit "dict(a="value", another="value")"
    1000000 loops, best of 3: 0.79 usec per loop
    $ python -m timeit "{'a': 'value','another': 'value'}"
    1000000 loops, best of 3: 0.305 usec per loop
    
  • Wenn die spezielle Syntax für Wörterbuchliterale nicht verwendet werden sollte, würde sie wahrscheinlich nicht existieren.

Ich verwende fast immer geschweifte Klammern; In einigen Fällen, in denen ich Tests schreibe, mache ich jedoch das Packen/Entpacken von Schlüsselwörtern, und in diesen Fällen ist dict() viel wartungsfreundlicher, da ich nichts ändern muss:

a=1,
b=2,

zu:

'a': 1,
'b': 2,

Es hilft auch in einigen Fällen, in denen ich denke, dass ich es zu einem späteren Zeitpunkt in eine benannte Tupel- oder Klasseninstanz umwandeln möchte.

Bei der Implementierung selbst bevorzuge ich aufgrund meiner Besessenheit von Optimierung und wenn ich keinen besonders großen Vorteil bei der Wartbarkeit sehe, immer geschweifte Klammern.

In Tests und der Implementierung würde ich niemals dict() verwenden, wenn die Möglichkeit besteht, dass die damals oder in Zukunft hinzugefügten Schlüssel entweder:

  • Nicht immer eine Zeichenfolge sein
  • Enthalten nicht nur Ziffern, ASCII-Buchstaben und Unterstriche
  • Beginnen Sie mit einer ganzen Zahl (dict(1foo=2) löst einen Syntaxfehler aus)

Ich denke, die erste Option ist besser, weil Sie auf die Werte als zugreifen werden[‘a’] oder ein[‘another’]. Die Schlüssel in Ihrem Wörterbuch sind Zeichenfolgen, und es gibt keinen Grund, so zu tun, als wären sie es nicht. Für mich sieht die Keyword-Syntax auf den ersten Blick clever aus, aber auf den zweiten Blick obskur. Das macht für mich nur Sinn, wenn Sie mit arbeiten __dict__und die Schlüsselwörter werden später zu Attributen, so etwas in der Art.

Benutzer-Avatar
Joshua Richardson

Zu Ihrer Information, falls Sie Ihrem Wörterbuch Attribute hinzufügen müssen (Dinge, die an das Wörterbuch angehängt sind, aber nicht zu den Schlüsseln gehören), benötigen Sie das zweite Formular. In diesem Fall können Sie Ihr Wörterbuch mit Schlüsseln mit beliebigen Zeichen einzeln initialisieren, wie folgt:

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

Benutzer-Avatar
jpaugh

Manchmal dict() ist eine gute Wahl:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

  • Es gibt eine Aufzählungsfunktion, die dies besser machen könnte. Übrigens gibt es einen Enum-Typ, der das, was Sie hier tun, besser kann. Außerdem ist dies überhaupt keine Antwort auf die Frage.

    – Dämmerungsläufer

    29. Juni 2016 um 23:03 Uhr

  • Gleich wie: {x:y for x,y in zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)])}

    – Vulwsztyn

    8. April um 17:43 Uhr

1062720cookie-checkWas ist die bevorzugte Syntax zum Initialisieren eines Diktats: Literale in geschweiften Klammern {} oder die Funktion dict()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy