2016-04-02 19 views
8

Sono nuovo in Python e ho letto sia la documentazione online che (cercando) di seguire PEP 0008 per avere un buon codice in stile Python. Io sono curioso di sapere il segmento di codice che ho trovato in Python ufficiale docs durante gli studi sulla libreria Re:Convenzione di denominazione Python - namedtuples

import collections 

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

non riesco a capire il motivo per cui la variabile Token è chiamato con una prima lettera maiuscola; Ho letto il PEP 0008 e non c'è riferimento per ciò che ho visto. Non dovrebbe essere token invece o TOKEN se fosse una costante (che per quanto ne so non lo sia)?

+5

Perché è una classe - 'namedtuple' è una fabbrica di classe. – jonrsharpe

risposta

9

Nel segmento di codice fornito, Token è un named tuple, sicuramente non una costante. Non segue lo stile di denominazione di altri nomi di variabili solo per porre l'accento sul fatto che si tratta di una funzione di fabbrica di classe . Nessun avviso avverrà da un ispettore stile PEP 0008 (come PyCharm per esempio) se si scrive come token ma penso che non è una buona pratica dal momento che in questo modo non distingue come un nome di classe di fabbrica.

Quindi, namedtuples rientrano nello Class names in PEP 0008. Peccato non viene indicato in modo più esplicito. Oltre l'esempio che lei ha citato per writing a tokenizer, questo può essere visto anche negli collections.namedtuple docs esempi:

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

La risposta di Anti Haapala mi ha battuto. Bella risposta. – Yannis

+0

Bene la tua risposta è migliore: d –

+0

Entrambe le ottime risposte, mi è piaciuto molto il link a PEP 0008. Grazie – Karim

8

La chiave qui è collections.namedtuple. Come dice la documentazione,

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

restituisce una nuova tuplesottoclasse nome typename. La nuova sottoclasse viene utilizzata per creare oggetti simili a tuple che hanno campi accessibili dalla ricerca di attributi oltre ad essere indicizzabili e iterabili. Le istanze della sottoclasse hanno anche una docstring utile (con typename e field_names) e un utile metodo __repr__() che elenca i contenuti della tupla in un formato name=value.

Non c'è violazione PEP 8; Token è una classe definita dall'utente e il suo nome è in maiuscolo come dovrebbe.

Problemi correlati