Wie lautet die Namenskonvention in Python für Variablen- und Funktionsnamen?

772

Ausgehend von einem C # -Hintergrund lautet die Namenskonvention für Variablen und Methodennamen normalerweise entweder camelCase oder PascalCase:

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

In Python habe ich das Obige gesehen, aber ich habe auch gesehen, dass Unterstriche verwendet werden:

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

Gibt es einen bevorzugteren, definitiven Codierungsstil für Python?

Strahl
quelle

Antworten:

867

Siehe Python PEP 8: Funktions- und Variablennamen :

Funktionsnamen sollten in Kleinbuchstaben geschrieben sein, wobei die Wörter nach Bedarf durch Unterstriche getrennt sind , um die Lesbarkeit zu verbessern.

Variablennamen folgen der gleichen Konvention wie Funktionsnamen.

MixedCase ist nur in Kontexten zulässig, in denen dies bereits der vorherrschende Stil ist (z threading.py ), um die Abwärtskompatibilität beizubehalten.

S.Lott
quelle
127
PEP = Python Enhancement Proposal.
Peter Mortensen
8
@ RickyRobinson Welchen hirntoten Code-Editor verwenden Sie, der nicht weiß, dass der Unterstrich ein Wort fortsetzt? Viele freie, die es tun. Ich benutze Notepad ++, wenn keine IDE verfügbar ist. Dazu kann eine Vorlage für die Python-Bearbeitung heruntergeladen werden. (Andere können noch nützlichere kostenlose Downloads empfehlen.)
ToolmakerSteve
57
Ein Fall für den unterstrichenen Stil ist, dass Sie Ein-Buchstaben-Wörter besser verwenden können. Zum Beispiel (ein ziemlich dummes) Beispiel, findMeAClassist vielleicht hässlicher als find_me_a_class.
Heltonbiker
9
Ich finde, dass die Konvention von Variablennamen in Kleinbuchstaben im wissenschaftlichen Rechnen nicht geeignet ist, wo man häufig auf bekannte Konstanten, Tensoren usw. stößt, die durch Großbuchstaben gekennzeichnet sind.
Andreasdr
12
@rr PEP8 ist ein "Style Guide" und beschreibt sich selbst als Konvention, NICHT als Standard. Außerdem werden die Gründe für die Nichteinhaltung dieser "Regeln" klar erläutert.
Die Tahaan
710

Der Google Python Style Guide hat die folgende Konvention:

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.

Ein ähnliches Namensschema sollte auf a angewendet werden CLASS_CONSTANT_NAME

JohnTESlade
quelle
37
a) Ich liebe Beispiele - danke. b) Unattraktive Mischung aus CamelCase und Unterstrichen? Aber: Da Python und sein flexibleres Datenmodell neu sind, steckt hinter Googles Leitfaden ein solides Denken ...
Matthew Cornell
19
@MatthewCornell Mischen ist nicht schlecht, solange Sie dabei bleiben. Dies erleichtert die Lesbarkeit, wenn Sie wissen, dass Funktionen Unterstriche haben und Klassen dies nicht tun.
Pithikos
1
@MatthewCornell Ich würde nicht annehmen, dass es etwas mit Python zu tun hat. Go erzwingt tatsächlich willkürliche Schönheitsstandards und kann nicht kompiliert werden, wenn Sie beispielsweise die Konvention für geschweifte Klammern nicht einhalten. Im Wesentlichen ist es ein Würfelwurf, ob jemand tatsächlich sorgfältig nachgedacht hat oder einfach die Art und Weise, wie er Dinge tut, wirklich geliebt hat.
Parthian Shot
Würden Sie ein konstantes statisches Attribut als GLOBAL_CONSTANT_NAME betrachten? Es ist nicht gerade global, da es im Rahmen der Klasse liegt.
James T.
dann kommt er herein property... vielleicht ist es eine Frage dessen, was der Gegenstand vorgibt zu sein, anstatt was er tatsächlich ist
Joelb
240

David Goodger (in „Code wie ein Pythonista“ hier ) beschreibt den PEP 8 Empfehlungen wie folgt:

  • joined_lower für Funktionen, Methoden, Attribute, Variablen

  • joined_loweroder ALL_CAPSfür Konstanten

  • StudlyCaps für Klassen

  • camelCase nur um bereits bestehenden Konventionen zu entsprechen

unmontiert
quelle
3
+1 visuelle Beispiele. Obwohl ich nicht sehen konnte, wo PEP8 joined_lowerfür Konstanten vorschlägt , nur "alle Großbuchstaben mit Unterstrichen, die Wörter trennen". Neugierig auch auf die neue Enum- Funktion.
Bob Stein
1
StudlyCaps for classesist eine großartige universelle Regel für Klassen in fast allen Sprachen. Warum sind dann einige Python-Klassen eingebaut (wie datetime.datetimefolgt diese Konvention nicht?
Prahlad Yeri
3
@PrahladYeri: Leider unittest.TestCase.assertEqualfolgen Freunde auch nicht der snake_case-Konvention. Die Wahrheit ist, dass Teile der Python-Standardbibliothek entwickelt wurden, bevor sich die Konventionen verfestigt hatten, und wir bleiben jetzt bei ihnen.
Wchargin
3
CamelCase ist verwirrend, weil einige Leute sagen, es sei "camelCase" (auch als "MixedCase" bekannt) und einige Leute sagen, es sei "CamelCase" (auch als "StudlyCaps" bekannt). Im PEP wird beispielsweise "CamelCase" erwähnt, während Sie "camelCase" erwähnen.
Pro Q
Ihr Here-Link ist tot, vielleicht sollte er durch etwas wie david.goodger.org/projects/pycon/2007/idiomatic
Wolf
42

Wie der Style Guide für Python Code zugibt,

Die Namenskonventionen in Pythons Bibliothek sind ein bisschen chaotisch, daher werden wir dies nie vollständig konsistent machen

Beachten Sie, dass sich dies nur auf die Standardbibliothek von Python bezieht . Wenn sie nicht so konsistent werden können, gibt es kaum Hoffnung auf eine allgemein eingehaltene Konvention für den gesamten Python-Code, oder?

Daraus und aus der Diskussion hier würde ich schließen, dass es keine schreckliche Sünde ist, wenn man beim Übergang zu Python weiterhin die (klaren und gut etablierten) Namenskonventionen von Java oder C # für Variablen und Funktionen verwendet. Denken Sie natürlich daran, dass es am besten ist, sich an den vorherrschenden Stil für eine Codebasis / ein Projekt / ein Team zu halten. Wie der Python Style Guide hervorhebt, ist die interne Konsistenz am wichtigsten.

Fühlen Sie sich frei, mich als Ketzer zu entlassen. :-) Wie das OP bin ich noch kein "Pythonista".

Jonik
quelle
32

Es gibt PEP 8 , wie andere Antworten zeigen, aber PEP 8 ist nur der Styleguide für die Standardbibliothek und wird nur als Evangelium darin verstanden. Eine der häufigsten Abweichungen von PEP 8 für andere Codeteile ist die Benennung von Variablen, insbesondere für Methoden. Es gibt keinen einzigen vorherrschenden Stil, obwohl man angesichts des Codevolumens, das MixedCase verwendet, wahrscheinlich eine Version von PEP 8 mit MixedCase erhalten würde, wenn man eine strenge Volkszählung durchführen würde. Es gibt kaum eine andere Abweichung von PEP 8, die genauso häufig ist.

Thomas Wouters
quelle
9
Dies mag im Jahr 2008 der Fall gewesen sein, als dies beantwortet wurde, aber heutzutage verwenden fast alle großen Bibliotheken PEP 8-Namenskonventionen.
Thane Brimhall
28

Wie bereits erwähnt, soll PEP 8 lower_case_with_underscoresfür Variablen, Methoden und Funktionen verwendet werden.

Ich bevorzuge die Verwendung lower_case_with_underscoresfür Variablen und mixedCasefür Methoden und Funktionen, um den Code expliziter und lesbarer zu machen. Dem Zen von Python zu folgen "explizit ist besser als implizit" und "Lesbarkeit zählt"

Claytron
quelle
3
+1 Ich wechsle diese beiden (ich verwende MixedCase für Variablen), aber wenn alles so deutlich ist, wird sofort klar, womit Sie es zu tun haben, zumal Sie Funktionen weitergeben können.
Xiong Chiamiov
2
Obwohl "Lesbarkeit" sehr subjektiv ist. Ich finde Methoden mit Unterstrich besser lesbar.
Pithikos
Ihre Präferenz war meine anfängliche Intuition, die aus vielen Jahren Java-Entwicklung stammt. Ich benutze _ gerne für Variablen, aber aus der Sicht sieht es für mich für Funktionen und Methoden nur ein bisschen komisch aus.
Michael Szczepaniak
21

weiter zu dem, was @JohnTESlade geantwortet hat. Der Python-Styleguide von Google enthält einige hübsche Empfehlungen.

Zu vermeidende Namen

  • Einzelzeichennamen mit Ausnahme von Zählern oder Iteratoren
  • Bindestriche (-) in einem beliebigen Paket- / Modulnamen
  • \__double_leading_and_trailing_underscore__ names (reserviert von Python)

Namenskonvention

  • "Intern" bedeutet intern innerhalb eines Moduls oder geschützt oder privat innerhalb einer Klasse.
  • Das Voranstellen eines einzelnen Unterstrichs (_) unterstützt den Schutz von Modulvariablen und -funktionen (nicht im Import * von enthalten). Das Voranstellen eines doppelten Unterstrichs (__) an eine Instanzvariable oder -methode dient effektiv dazu, die Variable oder Methode für ihre Klasse privat zu machen (unter Verwendung der Namensverknüpfung).
  • Platzieren Sie verwandte Klassen und Funktionen der obersten Ebene in einem Modul. Im Gegensatz zu Java müssen Sie sich nicht auf eine Klasse pro Modul beschränken.
  • Verwendung CapWordsfür Klassennamen, aber lower_with_under.pyfür Modulnamen. Obwohl viele Module benannt sind CapWords.py, wird davon abgeraten, da es verwirrend ist, wenn das Modul zufällig nach einer Klasse benannt wird. ("Warte - habe ich geschrieben import StringIOoder from StringIO import StringIO?")

Richtlinien, die aus Guidos Empfehlungen abgeleitet wurden Geben Sie hier die Bildbeschreibung ein

Sufiyan Ghori
quelle
17

Die meisten Python-Leute bevorzugen Unterstriche, aber selbst ich benutze Python seit mehr als 5 Jahren, ich mag sie immer noch nicht. Sie sehen für mich nur hässlich aus, aber vielleicht ist das alles Java in meinem Kopf.

Ich mag CamelCase einfach besser, da es besser zu der Art und Weise passt, wie Klassen benannt werden. Es fühlt sich logischer an, SomeClass.doSomething()als zu haben SomeClass.do_something(). Wenn Sie sich im globalen Modulindex in Python umschauen, werden Sie beides finden. Dies liegt an der Tatsache, dass es sich um eine Sammlung von Bibliotheken aus verschiedenen Quellen handelt, die im Laufe der Zeit gewachsen sind und nicht von einem Unternehmen wie Sun mit strengen Codierungsregeln entwickelt wurden . Ich würde sagen, das Fazit lautet: Verwenden Sie, was Sie besser mögen, es ist nur eine Frage des persönlichen Geschmacks.

André
quelle
10
Ich komme aus Java und finde Unterstreichungen ausführlich und unattraktiv, wobei nur letztere die Meinung sind. Die Benennung ist in gewisser Hinsicht ein Gleichgewicht zwischen Lesbarkeit und Kürze. Unix geht zu weit, aber seine en.wikipedia.org/wiki/Domain-specific_language ist begrenzt. CamelCase ist aufgrund der Kappen lesbar, hat aber keine zusätzlichen Zeichen. 2c
Matthew Cornell
2
Für mich sind Unterstriche in Funktionen / Methoden attraktiv, da ich jeden Unterstrich als Trennzeichen für einen virtuellen (in meinem Kopf) Namespace sehe. Auf diese Weise kann ich einfach wissen , wie meine neue Funktionen / Methoden nennen: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos
3
Sie rufen (normalerweise) nicht an SomeClass.doSomething()(statische Methoden sind im Allgemeinen selten), die Sie normalerweise anrufenan_instance.do_something()
Dave
15

Persönlich versuche ich, CamelCase für Klassen, MixedCase-Methoden und -Funktionen zu verwenden. Variablen werden normalerweise durch Unterstriche getrennt (wenn ich mich erinnern kann). Auf diese Weise kann ich auf einen Blick erkennen, was genau ich anrufe, anstatt dass alles gleich aussieht.

Kristallgitter
quelle
15
Camel case beginnt mit einem Kleinbuchstaben IIRC wie "camelCase".
UnkwnTech
11
Ich denke, Crystalattice hatte es richtig gemacht - zumindest stimmt seine Verwendung mit der Verwendung im PEP8 (CamelCase und MixedCase) überein.
Jarrett
1
@ UnkwnTech Der Begriff für FirstLetterUpper wird manchmal PascalCase
SurpriseDog
CamelCase oder camelCase? nur wundern.
Sumit Pokhrel
11

Es gibt ein Papier darüber: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Es heißt, dass snake_case besser lesbar ist als camelCase. Deshalb verwenden (oder sollten) moderne Sprachen die Schlange, wo immer sie können.

Alebian
quelle
9
Interessanterweise heißt es auch: "Die Ergebnisse dieser Studie gelten möglicherweise nicht unbedingt für im Quellcode eingebettete Bezeichner. Es ist durchaus möglich, dass Bezeichner mit Kamelhülle als besseres Gestaltelement fungieren, wenn sie in Programmierkonstrukte eingebettet sind."
Rob3c
2

Der Codierungsstil ist normalerweise Teil der internen Richtlinien- / Konventionsstandards einer Organisation, aber ich denke, im Allgemeinen ist der all_lower_case_underscore_separator-Stil (auch snake_case genannt) in Python am gebräuchlichsten.

fuentesjr
quelle
0

Ich persönlich verwende Javas Namenskonventionen bei der Entwicklung in anderen Programmiersprachen, da diese konsistent und leicht zu befolgen sind. Auf diese Weise kämpfe ich nicht ständig darüber, welche Konventionen ich verwenden soll, was nicht der schwierigste Teil meines Projekts sein sollte!

Bradylange
quelle
Ich stimme etwas zu. Wenn Sprache X nur einen kleinen Teil des Projekts ausmacht, kann der Kontextwechsel beim Formatieren von Text eine Belastung sein. Das Hauptproblem ist, dass Bibliotheken Aufrufe in einem Stil haben ( library_function(my_arg)).
Lan
-2

Normalerweise folgt man den Konventionen, die in der Standardbibliothek der Sprache verwendet werden.

Yfeldblum
quelle