Qual è la convenzione di denominazione in Python per nomi di variabili e funzioni?


773

Proveniente da uno sfondo C #, la convenzione di denominazione per variabili e nomi di metodi è generalmente camelCase o PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

In Python, ho visto quanto sopra ma ho anche visto i trattini bassi usati:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

Esiste uno stile di codifica più preferibile e definitivo per Python?

Risposte:


867

Vedi Python PEP 8: nomi di funzioni e variabili :

I nomi delle funzioni devono essere minuscoli, con le parole separate da caratteri di sottolineatura, se necessario per migliorare la leggibilità.

I nomi delle variabili seguono la stessa convenzione dei nomi delle funzioni.

mixedCase è consentito solo in contesti in cui è già lo stile prevalente (ad esempio threading.py ), per mantenere la compatibilità con le versioni precedenti.


127
PEP = proposta di potenziamento di Python.
Peter Mortensen,

8
@RickyRobinson Quale editor di codice morto nel cervello stai usando, che non sa che la sottolineatura continua una parola? Molti di quelli gratuiti che lo fanno. Uso Notepad ++, se un IDE non è disponibile. Per questo, è possibile scaricare un modello per la modifica di Python. (Altri possono consigliare download gratuiti ancora più utili.)
ToolmakerSteve

57
Un caso per lo stile sottolineato è che puoi usare meglio le parole di una lettera. Per un esempio (piuttosto sciocco), findMeAClassè forse più brutto di find_me_a_class.
heltonbiker,

9
Trovo che la convenzione dei nomi delle variabili minuscole non sia adatta nel calcolo scientifico, dove spesso si incontrano costanti, tensori ecc. Ben noti che sono indicati con lettere maiuscole.
andreasdr,

12
@rr PEP8 è una "Guida di stile" e si descrive come una Convenzione, NON uno standard. Spiega inoltre chiaramente le ragioni per non seguire sempre queste "regole".
Il Tahaan,

710

La Guida allo stile di Google Python ha la seguente convenzione:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

Uno schema di denominazione simile dovrebbe essere applicato a CLASS_CONSTANT_NAME


37
a) Adoro gli esempi - grazie. b) Miscela poco attraente di CamelCase e caratteri di sottolineatura? Ma: essendo nuovo a Python e al suo modello di dati più flessibile, scommetto che ci sia un solido pensiero dietro la guida di Google ...
Matthew Cornell,

19
La miscelazione di @MatthewCornell non è male finché ci si attacca. In realtà semplifica la leggibilità se sai che le funzioni hanno caratteri di sottolineatura e le classi no.
Pithikos,

1
@MatthewCornell Non darei per scontato che non abbia nulla a che fare con Python. Go in realtà applica standard arbitrari di bellezza e non riuscirà a compilare se non si aderisce, ad esempio, alla loro convenzione di parentesi graffe. In sostanza, è un tiro di dado sul fatto che qualcuno abbia davvero avuto un pensiero attento o abbia semplicemente amato il modo in cui fa le cose.
Parthian Shot,

Considereresti un attributo statico costante un GLOBAL_CONSTANT_NAME? Non è esattamente globale in quanto rientra nell'ambito della classe.
James T.

poi entra property... forse è una questione di ciò che finge di essere, piuttosto che di quello che è in realtà
joelb

240

David Goodger (in "Code Like a Pythonista" qui ) descrive le raccomandazioni di PEP 8 come segue:

  • joined_lower per funzioni, metodi, attributi, variabili

  • joined_lowero ALL_CAPSper costanti

  • StudlyCaps per le lezioni

  • camelCase solo per conformarsi alle convenzioni preesistenti


3
+1 esempi visivi. Anche se non ho potuto vedere dove PEP8 suggerisce joined_lowerper le costanti , solo "tutte le lettere maiuscole di sottolineatura che separa le parole". Curioso anche della nuova funzionalità enum .
Bob Stein,

1
StudlyCaps for classesè una grande regola universale per le lezioni in quasi tutte le lingue. Allora perché alcune classi integrate in Python (come datetime.datetimenon seguono questa convenzione?
Prahlad Yeri,

3
@PrahladYeri: Sfortunatamente, unittest.TestCase.assertEquale anche gli amici non seguono la convenzione snake_case. La verità è che parti della libreria standard di Python sono state sviluppate prima che le convenzioni si fossero consolidate, e ora ne siamo bloccati.
wchargin,

3
CamelCase è confuso perché alcune persone dicono che è "camelCase" (noto anche come "mixedCase") e alcune persone dicono che è "CamelCase" (noto anche come "StudlyCaps"). Ad esempio, il PEP menziona "CamelCase" mentre menzioni "camelCase".
Pro Q

il tuo link qui è morto, forse dovrebbe essere sostituito da qualcosa come david.goodger.org/projects/pycon/2007/idiomatic
Wolf

42

Come ammette la Guida di stile per Python Code ,

Le convenzioni di denominazione della libreria di Python sono un po 'un casino, quindi non riusciremo mai a renderlo completamente coerente

Nota che questo si riferisce solo alla libreria standard di Python . Se non riescono a essere così coerenti, allora non c'è molta speranza di avere una convenzione generalmente rispettata per tutto il codice Python, vero?

Da ciò, e dalla discussione qui, desidero dedurre che non è un peccato orribile se si continuano ad usare ad esempio le convenzioni di denominazione di Java o C # (chiare e consolidate) per variabili e funzioni quando si passa a Python. Ricordando, ovviamente, che è meglio attenersi a qualunque sia lo stile prevalente per una base di codice / progetto / squadra. Come sottolinea la Python Style Guide, la coerenza interna conta di più.

Sentiti libero di licenziarmi come eretico. :-) Come l'OP, non sono un "Pythonista", non ancora.


32

C'è PEP 8 , come mostrano altre risposte, ma PEP 8 è solo la styleguide per la libreria standard, ed è presa solo come vangelo in essa. Una delle deviazioni più frequenti di PEP 8 per altre parti di codice è la denominazione variabile, in particolare per i metodi. Non esiste un unico stile predominante, anche se considerando il volume di codice che utilizza mixedCase, se si effettuasse un censimento rigoroso si finirebbe probabilmente con una versione di PEP 8 con mixedCase. C'è poca altra deviazione dal PEP 8 che è abbastanza comune.


9
Questo potrebbe essere vero nel '08 quando fu data risposta, ma oggigiorno quasi tutte le principali biblioteche usano convenzioni di denominazione PEP 8.
Thane Brimhall,

29

Come accennato, PEP 8 dice di usare lower_case_with_underscoresper variabili, metodi e funzioni.

Preferisco usare lower_case_with_underscoresper variabili e mixedCaseper metodi e funzioni che rendono il codice più esplicito e leggibile. Quindi seguendo lo Zen di Python "esplicito è meglio che implicito" e "Contabilità"


3
+1 Cambio quei due (uso mixedCase per le variabili), ma avere tutto ciò che è più distinto in questo modo aiuta a rendere immediatamente ovvio ciò con cui hai a che fare, soprattutto perché puoi passare le funzioni.
Xiong Chiamiov,

2
Sebbene la "leggibilità" sia altamente soggettiva. Trovo che i metodi con la sottolineatura siano più leggibili.
Pithikos,

La tua preferenza è stata la mia intuizione iniziale proveniente da molti anni di sviluppo Java. Mi piace usare _ per le variabili, ma dagli occhi mi sembra un po 'divertente per funzioni e metodi.
Michael Szczepaniak,

21

oltre a ciò che ha risposto @JohnTESlade. La guida allo stile di Python di Google ha alcuni consigli piuttosto accurati,

Nomi da evitare

  • nomi di caratteri singoli tranne contatori o iteratori
  • trattini (-) in qualsiasi nome di pacchetto / modulo
  • \__double_leading_and_trailing_underscore__ names (riservato da Python)

Convenzione di denominazione

  • "Interno" significa interno a un modulo o protetto o privato all'interno di una classe.
  • La preparazione di un singolo carattere di sottolineatura (_) ha un certo supporto per la protezione delle variabili e delle funzioni del modulo (non incluse con import * da). La preparazione di un carattere di sottolineatura doppio (__) a una variabile o metodo di istanza serve effettivamente a rendere la variabile o il metodo privati ​​per la sua classe (usando la modifica del nome).
  • Metti insieme le classi e le funzioni di livello superiore in un modulo. A differenza di Java, non è necessario limitarsi a una classe per modulo.
  • Utilizzare CapWordsper i nomi delle classi, ma lower_with_under.pyper i nomi dei moduli. Sebbene ci siano molti moduli esistenti denominati CapWords.py, questo è ora scoraggiato perché è confuso quando il modulo viene chiamato dopo una classe. ("aspetta - ho scritto import StringIOo from StringIO import StringIO?")

Linee guida derivate dalle raccomandazioni di Guido inserisci qui la descrizione dell'immagine


17

La maggior parte delle persone di Python preferisce i caratteri di sottolineatura, ma anche io uso Python da più di 5 anni in questo momento, ancora non mi piacciono. Mi sembrano solo brutti, ma forse è tutta la Java nella mia testa.

Ho semplicemente come CamelCase meglio dato che si adatta meglio con il modo in cui le classi sono chiamate, ci si sente più logico avere SomeClass.doSomething()rispetto SomeClass.do_something(). Se ti guardi intorno nell'indice del modulo globale in Python, troverai entrambi, il che è dovuto al fatto che è una raccolta di librerie da varie fonti che sono cresciute negli straordinari e non qualcosa che è stato sviluppato da un'azienda come Sun con rigide regole di codifica . Direi che la linea di fondo è: usa quello che ti piace di più, è solo una questione di gusti personali.


10
Vengo da uno sfondo Java, e trovo che i caratteri di sottolineatura siano verbosi e poco attraenti, con solo quest'ultimo che è opinione. La denominazione è per alcuni aspetti un equilibrio tra leggibilità e brevità. Unix va troppo lontano, ma il suo en.wikipedia.org/wiki/Domain-specific_language è limitato. CamelCase è leggibile grazie alle maiuscole, ma non ha caratteri aggiuntivi. 2c
Matthew Cornell,

2
Per me i caratteri di sottolineatura sono interessanti in funzioni / metodi poiché vedo ogni carattere di sottolineatura come un separatore per uno spazio dei nomi virtuale (nella mia testa). In questo modo posso facilmente sapere come denominare le mie nuove funzioni / metodi: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos

3
Non chiamate (in genere) SomeClass.doSomething()(i metodi statici sono generalmente rari) di solito chiamatean_instance.do_something()
Dave,

15

Personalmente provo ad usare CamelCase per classi, metodi e funzioni mixedCase. Le variabili di solito sono sottolineate da caratteri separati (quando posso ricordare). In questo modo posso dire a colpo d'occhio cosa sto esattamente chiamando, piuttosto che tutto sembra uguale.


15
La custodia del cammello inizia con una lettera minuscola IIRC come "camelCase".
UnkwnTech,

11
Penso che crystalattice abbia avuto ragione - almeno, il suo utilizzo è coerente con l'uso in PEP8 (CamelCase e mixedCase).
Jarrett,

1
@UnkwnTech Il termine per FirstLetterUpper è talvolta chiamato PascalCase
SurpriseDog

CamelCase o camelCase? justWondering.
Sumit Pokhrel,

11

C'è un articolo su questo: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Dice che snake_case è più leggibile di camelCase. Ecco perché le lingue moderne usano (o dovrebbero usare) il serpente dove possono.


9
È interessante notare che dice anche "I risultati di questo studio potrebbero non applicarsi necessariamente agli identificatori incorporati nel codice sorgente. È del tutto possibile che gli identificatori con camme possano agire come un migliore elemento gestalt quando sono incorporati all'interno di costrutti di programmazione".
rob3c,

2

Lo stile di codifica di solito fa parte degli standard di politica interna / convenzione di un'organizzazione, ma penso in generale, lo stile all_lower_case_underscore_separator (chiamato anche snake_case) è più comune in Python.


0

Personalmente utilizzo le convenzioni di denominazione di Java quando sviluppo in altri linguaggi di programmazione poiché è coerente e facile da seguire. In questo modo non continuo a lottare su quali convenzioni usare che non dovrebbero essere la parte più difficile del mio progetto!


Sono abbastanza d'accordo. Se la lingua X è solo una piccola parte del progetto, il cambio di contesto su come formattare il testo può essere un peso. Il problema principale è che le librerie avranno chiamate in uno stile ( library_function(my_arg)).
Lan

-2

In genere, si seguono le convenzioni utilizzate nella libreria standard del linguaggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.