Jaka jest konwencja nazewnictwa w Pythonie dla nazw zmiennych i funkcji?

772

Pochodząca z tła C # konwencja nazewnictwa zmiennych i nazw metod to zwykle camelCase lub PascalCase:

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

W Pythonie widziałem powyższe, ale widziałem także używane podkreślenia:

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

Czy istnieje bardziej preferowany, ostateczny styl kodowania dla Pythona?

Promień
źródło

Odpowiedzi:

867

Zobacz Python PEP 8: Nazwy funkcji i zmiennych :

Nazwy funkcji powinny być pisane małymi literami, w razie potrzeby słowa oddzielane podkreślnikami, aby poprawić czytelność.

Nazwy zmiennych są zgodne z tą samą konwencją co nazwy funkcji.

MixedCase jest dozwolony tylko w kontekstach, w których jest to już dominujący styl (np. threading.py ), aby zachować kompatybilność wsteczną.

S.Lott
źródło
127
PEP = Propozycja rozszerzenia Pythona.
Peter Mortensen
8
@RickyRobinson Jakiego edytora kodu nie używasz, który nie wie, że podkreślenie kontynuuje słowo? Wiele darmowych. Używam Notepad ++, jeśli IDE nie jest dostępne. W tym celu można pobrać szablon do edycji w języku Python. (Inni mogą polecić jeszcze bardziej przydatne bezpłatne pliki do pobrania).
ToolmakerSteve,
57
Jednym z przykładów podkreślonego stylu jest to, że można lepiej używać słów składających się z jednej litery. Bo (raczej głupi) przykład findMeAClassjest może brzydszy niż find_me_a_class.
heltonbiker
9
Uważam, że konwencja nazw małych i małych zmiennych nie jest odpowiednia w obliczeniach naukowych, gdzie często spotyka się dobrze znane stałe, tensory itp., Które są oznaczone dużymi literami.
andreasdr
12
@rr PEP8 jest „Przewodnikiem po stylach” i opisuje się jako konwencja, a nie norma. Wyjaśnia również jasno przyczyny, dla których nie zawsze przestrzega się tych „zasad”.
Tahaan,
710

Google Python Style Guide ma następującą konwencją:

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.

Podobny schemat nazewnictwa należy zastosować do CLASS_CONSTANT_NAME

JohnTESlade
źródło
37
a) Uwielbiam przykłady - dzięki. b) Nieatrakcyjna mieszanka CamelCase i podkreślników? Ale: będąc nowym w Pythonie i jego bardziej elastycznym modelu danych, założę się, że za przewodnikiem Google stoi solidne myślenie ...
Matthew Cornell,
19
@MatthewCornell miksowanie nie jest złe, dopóki się go trzymasz. W rzeczywistości ułatwia to czytelność, jeśli wiesz, że funkcje mają podkreślenia, a klasy nie.
Pithikos
1
@MatthewCornell Nie sądzę, że ma to coś wspólnego z pythonem. Go faktycznie egzekwuje arbitralne standardy piękna i nie uda się go skompilować, jeśli nie będziesz przestrzegać, na przykład, ich konwencji nawiasów klamrowych. Zasadniczo jest to rzut kostką, czy ktoś rzeczywiście przemyślał uważnie, czy po prostu naprawdę lubił sposób, w jaki robi rzeczy.
Parthian Shot
Czy uważasz, że stały atrybut statyczny to GLOBAL_CONSTANT_NAME? Nie jest dokładnie globalny, ponieważ należy do klasy.
James T.
potem wchodzi property... być może chodzi o to, czym ten przedmiot udaje, a nie o to, czym w rzeczywistości jest
joelb,
240

David Goodger (w „Code Like a Pythonista” tutaj ) opisuje zalecenia PEP 8 w następujący sposób:

  • joined_lower dla funkcji, metod, atrybutów, zmiennych

  • joined_lowerlub ALL_CAPSdla stałych

  • StudlyCaps na zajęcia

  • camelCase tylko w celu zachowania zgodności z wcześniej istniejącymi konwencjami

nieoprawny
źródło
3
+1 wizualne przykłady. Chociaż nie mogłem zobaczyć, gdzie PEP8 wskazują joined_lowerna stałe , tylko „wszystkie litery z podkreślenia oddzielania słów”. Ciekawe także na temat nowej funkcji wyliczania .
Bob Stein
1
StudlyCaps for classesto świetna uniwersalna zasada dla klas w prawie wszystkich językach. Więc dlaczego niektóre wbudowane klasy Pythona (takie jak datetime.datetimenie przestrzegają tej konwencji?
Prahlad Yeri
3
@PrahladYeri: Niestety, unittest.TestCase.assertEquali przyjaciele nie przestrzegają konwencji węża. Prawda jest taka, że ​​niektóre części standardowej biblioteki Pythona zostały opracowane przed utrwaleniem się konwencji i teraz utknęliśmy z nimi.
wchargin 18.03.17
3
CamelCase jest mylący, ponieważ niektórzy mówią, że to „camelCase” (znany również jako „mixedCase”), a niektórzy twierdzą, że to „CamelCase” (znany również jako „StudlyCaps”). Na przykład PEP wspomina o „CamelCase”, a ty wspominasz o „camelCase”.
Pro Q
Twój link tutaj jest martwy, może powinien zostać zastąpiony przez coś takiego jak david.goodger.org/projects/pycon/2007/idiomatic
Wolf
42

Jak przyznaje przewodnik po stylu dla kodu Python ,

Konwencje nazewnictwa w bibliotece Pythona to trochę bałagan, więc nigdy nie uzyskamy tego całkowicie spójnego

Zauważ, że odnosi się to tylko do standardowej biblioteki Pythona . Jeśli nie są w stanie uzyskać takiej spójności, nie ma prawie żadnej nadziei na przyjęcie ogólnie przyjętej konwencji dla całego kodu Pythona, prawda?

Z tego i dyskusji tutaj wywnioskowałbym, że to nie jest straszny grzech, jeśli ktoś nadal używa np. (Jasnych i dobrze ugruntowanych) konwencji nazewnictwa dla zmiennych i funkcji przy przechodzeniu do Pythona. Pamiętając oczywiście, że najlepiej postępować zgodnie z dominującym stylem bazy kodu / projektu / zespołu. Jak wskazuje Przewodnik po stylu Python, najważniejsza jest spójność wewnętrzna .

Odrzuć mnie jako heretyka. :-) Podobnie jak OP, nie jestem „Pythonistą”, jeszcze nie.

Jonik
źródło
32

Istnieje PEP 8 , jak pokazują inne odpowiedzi, ale PEP 8 jest tylko przewodnikiem po stylach dla standardowej biblioteki i jest w niej tylko ewangelią. Jednym z najczęstszych odchyleń PEP 8 dla innych fragmentów kodu jest nazywanie zmiennych, szczególnie dla metod. Nie ma jednego dominującego stylu, chociaż biorąc pod uwagę objętość kodu, który używa mixedCase, gdyby wykonać ścisły spis, prawdopodobnie powstałaby wersja PEP 8 z mixedCase. Istnieje niewiele innych odchyleń od PEP 8, które są równie powszechne.

Thomas Wouters
źródło
9
Mogło to być prawdą w 2008 roku, kiedy udzielono na nie odpowiedzi, ale obecnie prawie wszystkie duże biblioteki używają konwencji nazewnictwa PEP 8.
Thane Brimhall
28

Jak wspomniano, PEP 8 mówi o używaniu lower_case_with_underscoreszmiennych, metod i funkcji.

Wolę używać lower_case_with_underscoreszmiennych, a także mixedCasemetod i funkcji, aby kod był bardziej wyraźny i czytelny. Zatem podążanie za Zenem Pythona „wyraźne jest lepsze niż niejawne” i „liczy się czytelność”

Claytron
źródło
3
+1 Zmieniam te dwa (używam mixedCase dla zmiennych), ale posiadanie wszystkiego bardziej wyraźnego takiego pomaga natychmiast pokazać, z czym masz do czynienia, zwłaszcza że możesz przekazywać funkcje.
Xiong Chiamiov
2
Chociaż „czytelność” jest wysoce subiektywna. Uważam, że metody z podkreśleniem są bardziej czytelne.
Pithikos
Twoja preferencja była moją początkową intuicją pochodzącą z wielu lat programowania Java. Lubię używać _ do zmiennych, ale z oczu wygląda to trochę zabawnie dla funkcji i metod.
Michael Szczepaniak,
21

w odpowiedzi na odpowiedź @JohnTESlade. Przewodnik po stylu pythonowym Google zawiera kilka fajnych rekomendacji,

Nazwy, których należy unikać

  • nazwy pojedynczych znaków, z wyjątkiem liczników lub iteratorów
  • myślniki (-) w nazwie dowolnego pakietu / modułu
  • \__double_leading_and_trailing_underscore__ names (zarezerwowane przez Python)

Konwencja nazewnictwa

  • „Wewnętrzny” oznacza wewnętrzny moduł lub chroniony lub prywatny w klasie.
  • Przygotowanie pojedynczego podkreślenia (_) ma pewne wsparcie dla ochrony zmiennych i funkcji modułu (nie dołączone do importu * z). Przygotowanie podwójnego podkreślenia (__) do zmiennej instancji lub metody skutecznie służy do uczynienia zmiennej lub metody prywatną dla swojej klasy (przy użyciu manglingu nazw).
  • Umieść powiązane klasy i funkcje najwyższego poziomu razem w module. W przeciwieństwie do Javy nie ma potrzeby ograniczania się do jednej klasy na moduł.
  • Użyj CapWordsdla nazw klas, ale lower_with_under.pydla nazw modułów. Chociaż istnieje wiele istniejących modułów o CapWords.pytej nazwie , jest to odradzane, ponieważ jest mylące, gdy moduł nazywa się po klasie. („czekaj - pisałem import StringIOczy from StringIO import StringIO?”)

Wytyczne oparte na zaleceniach Guido wprowadź opis zdjęcia tutaj

Sufiyan Ghori
źródło
17

Większość ludzi w Pythonie woli podkreślenia, ale nawet ja używam Pythona od ponad 5 lat, nadal ich nie lubię. Po prostu wyglądają dla mnie brzydko, ale może to wszystko Java w mojej głowie.

Po prostu lubię CamelCase, ponieważ lepiej pasuje do sposobu, w jaki nazywane są klasy. To bardziej logiczne SomeClass.doSomething()niż mieć SomeClass.do_something(). Jeśli rozejrzysz się w globalnym indeksie modułów w pythonie, znajdziesz oba, co wynika z faktu, że jest to zbiór bibliotek z różnych źródeł, które rosły z czasem, a nie coś, co zostało opracowane przez jedną firmę, np. Sun, z surowymi regułami kodowania . Powiedziałbym, że sedno brzmi: Użyj tego, co lubisz lepiej, to tylko kwestia osobistego gustu.

André
źródło
10
Pochodzę z języka Java i podkreślam, że podkreślenia są pełne i nieatrakcyjne, a tylko ta ostatnia jest opiniami. Nazewnictwo jest pod pewnymi względami równowagą między czytelnością a zwięzłością. Unix idzie za daleko, ale jego en.wikipedia.org/wiki/Domain-specific_language jest ograniczony. CamelCase jest czytelny ze względu na czapki, ale nie ma dodatkowych znaków. 2c
Matthew Cornell,
2
Dla mnie podkreślenia są atrakcyjne pod względem funkcji / metod, ponieważ widzę każdy znak podkreślenia jako separator dla wirtualnej (w mojej głowie) przestrzeni nazw. W ten sposób mogę łatwo wiedzieć jak nazwać moje nowych funkcji / metod: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos
3
Nie dzwonisz (zwykle) SomeClass.doSomething()(metody statyczne są na ogół rzadkie), zwykle dzwoniszan_instance.do_something()
Dave
15

Osobiście staram się używać CamelCase do klas, metod i funkcji mixedCase. Zmienne są zwykle oddzielane podkreśleniem (kiedy pamiętam). W ten sposób mogę na pierwszy rzut oka powiedzieć, do czego dokładnie dzwonię, a nie wszystko wygląda tak samo.

krystaliczna
źródło
15
Wielbłąd zaczyna się od małej litery IIRC, takiej jak „camelCase”.
UnkwnTech
11
Myślę, że Crystalattice miał rację - przynajmniej jego użycie jest zgodne z użyciem w PEP8 (CamelCase i mixedCase).
Jarrett,
1
@UnkwnTech Termin FirstLetterUpper jest czasem nazywany PascalCase
SurpriseDog
CamelCase czy camelCase? justWondering.
Sumit Pokhrel
11

Jest artykuł na ten temat: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Mówi, że snake_case jest bardziej czytelny niż camelCase. Dlatego współczesne języki używają (lub powinny) używać węża tam, gdzie to możliwe.

alebianski
źródło
9
Co ciekawe, mówi także: „Wyniki tego badania niekoniecznie muszą odnosić się do identyfikatorów osadzonych w kodzie źródłowym. Jest całkiem możliwe, że identyfikatory w obudowach wielbłądowych mogą działać jako lepszy element gestalt, gdy są osadzone w konstrukcjach programistycznych”.
rob3c
2

Styl kodowania jest zwykle częścią wewnętrznych standardów polityki / konwencji organizacji, ale myślę, że generalnie styl all_lower_case_underscore_separator (zwany również snake_case) jest najczęściej spotykany w pythonie.

fuentesjr
źródło
0

Osobiście korzystam z konwencji nazewnictwa Java podczas programowania w innych językach programowania, ponieważ jest on spójny i łatwy do naśladowania. W ten sposób nie nieustannie walczę o to, jakich konwencji użyć, co nie powinno być najtrudniejszą częścią mojego projektu!

bradylange
źródło
Nieco się zgadzam. Jeśli język X to tylko niewielka część projektu, zmiana kontekstu formatowania tekstu może być dużym obciążeniem. Główną czkawką jest to, że biblioteki będą miały wywołania w jednym stylu ( library_function(my_arg)).
Lan
-2

Zazwyczaj stosuje się konwencje stosowane w standardowej bibliotece języka.

yfeldblum
źródło