2016-04-02 6 views
8

Ich bin neu bei Python und habe sowohl die Online-Dokumentation gelesen als auch versucht, PEP 0008 zu folgen, um einen guten Python-Code-Stil zu haben. Ich bin neugierig auf das Codesegment ich in dem offiziellen Python gefunden docs während über die Wieder Bibliothek studieren:Python-Namenskonvention - nameduples

import collections 

Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column']) 

Ich kann nicht verstehen, warum die Token Variable mit einem ersten Buchstaben benannt wird aktiviert; Ich habe die PEP 0008 durchgelesen und es gibt keinen Hinweis darauf, was ich gesehen habe. Sollte es nicht token stattdessen oder TOKEN sein, wenn es eine Konstante war (was für alle ich weiß, ist es nicht)?

+5

Weil es eine Klasse - 'namedtuple' ist eine Klasse ab Werk: Neben dem Beispiel, das Sie für writing a tokenizer erwähnt, kann dies auch in den collections.namedtuple docs Beispielen hervor. – jonrsharpe

Antwort

9

In dem von Ihnen angegebenen Code-Segment ist Token ein named tuple, definitiv keine Konstante. Es folgt nicht anderen Benennungsstilen für Variablennamen, nur um darauf hinzuweisen, dass es sich um eine Klassenfactory-Funktion handelt. Keine Warnung wird von einem PEP 0008 Style Checker (wie PyCharm zum Beispiel) wenn Sie es schreiben als token aber ich denke, es ist keine gute Praxis, da auf diese Weise unterscheidet es nicht als eine Klasse Fabrik Name.

Also, nameduples fallen unter der Class names in PEP 0008. Schade ist nicht explizit angegeben.

Point = namedtuple('Point', ['x', 'y']) 
Point3D = namedtuple('Point3D', Point._fields + ('z',)) 
Book = namedtuple('Book', ['id', 'title', 'authors']) 
+0

Anti Haapala's Antwort hat mich dazu gebracht. Gute Antwort. – Yannis

+0

Nun, Ihre Antwort ist besser: d –

+0

Beide gute Antworten, ich mochte den Link zu PEP 0008 sehr. Danke – Karim

8

Der Schlüssel hier ist collections.namedtuple. Da die Dokumentation sagt,

collections.namedtuple(typename, field_names, verbose=False, rename=False)

Gibt eine neue tupleUnterklasse genannt typename. Die neue Unterklasse wird verwendet, um tuple -ähnliche Objekte zu erstellen, die über Felder verfügen, auf die durch Attributsuche zugegriffen werden kann, und die indexierbar und iterierbar sind. Instanzen der Unterklasse haben auch einen hilfreichen Docstring (mit typename und field_names) und eine hilfreiche __repr__() Methode, die den Tupelinhalt in einem name=value Format auflistet.

Es liegt keine Verletzung von PEP 8 vor; Token ist eine benutzerdefinierte Klasse und der Name wird groß geschrieben, wie es sollte.