Konwencje nazewnictwa modułów w Pythonie

102

Mam moduł, którego celem jest zdefiniowanie klasy o nazwie „nib”. (i kilka klas pokrewnych). Jak powinienem wywołać sam moduł? "stalówka"? „nibmodule”? Coś jeszcze?

Ram Rachum
źródło

Odpowiedzi:

110

Tylko stalówka. Nazwij klasę Nib, używając dużej litery N. Aby uzyskać więcej informacji na temat konwencji nazewnictwa i inne porady dotyczące stylu, zobacz PEP 8 , przewodnik po stylach Pythona.

Stephan202
źródło
2
Czy większość projektów w Pythonie jest zgodnych z tą konwencją? Ponieważ zauważyłem, że wbudowane klasy są zapisane małymi literami, np. List, string itp.
Ram Rachum
4
Twoja obserwacja dotycząca typów wbudowanych jest poprawna. Są to jednak zdecydowanie wyjątki. Większość innych klas zdefiniowanych w bibliotece standardowej jest pisana wielkimi literami.
Stephan202
2
Myślałem, że to właściwa konwencja, ale jest z nią nieodłączny problem, przynajmniej mi się wydaje. Powiedzmy, że mam wywoływaną klasę Clienti, co zrozumiałe, często robię jej przykłady, do których chcę zadzwonić client. Ale zgodnie z twoją konwencją nazwa modułu byłaby client, więc zawsze musiałbym nazywać moje instancje czymś nienaturalnym client_instance. Co myślisz o tym problemie?
Ray
3
@Ray Ale powiedzmy, że konwencja miała nazywać moduł Client, wtedy będzie to kolidować z nazwą klasy Client. Ponieważ istnieją tylko 3 możliwe warianty nazewnictwa ( client, Clientlub CLIENT) zawsze będzie zderzenie dwóch przypadków, klas, modułów lub stałych. Wydaje mi się, że mniej razy można nazwać swój moduł tak samo jak instancja lub stała niż klasa i dlatego jest to lepsza konwencja nazewnictwa innych możliwości. Dzięki temu importowanie z modułów będzie bardziej czytelne, ponieważ generalnie importujesz klasy i stałe, a nie zmienne.
Ted Klein Bergman
2
Powodem, dla którego znaki wbudowane są pisane małymi literami, jest sugerowanie, że zostały zaimplementowane w języku C, a nie w Pythonie.
Har
42

Nazwałbym to nib.py. I nazwałbym również stalówkę klasy.

W większym projekcie w Pythonie, nad którym pracuję, mamy wiele modułów definiujących w zasadzie jedną ważną klasę. Nazwy klas rozpoczynają się od dużej litery. Nazwy modułów są nazywane małymi literami jak klasy. Prowadzi to do importu, jak poniżej:

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

To trochę jak emulacja języka Java. Jedna klasa na plik. Ale z dodatkową elastycznością, zawsze możesz dodać kolejną klasę do pojedynczego pliku, jeśli ma to sens.

rincewind
źródło
28

Wiem, że moje rozwiązanie nie jest zbyt popularne z pythonowego punktu widzenia, ale wolę stosować podejście Java, w którym jeden moduł -> jedna klasa, z modułem nazwanym jako klasa. Rozumiem powód stylu Pythona, ale nie przepadam za bardzo dużym plikiem zawierającym wiele klas. Trudno mi się przeglądać pomimo składania.

Innym powodem jest kontrola wersji: posiadanie dużego pliku oznacza, że ​​Twoje zmiany mają tendencję do koncentrowania się na tym pliku. Może to potencjalnie prowadzić do większej liczby konfliktów do rozwiązania. Tracisz również dodatkowe informacje dziennika, że ​​twoje zatwierdzenie modyfikuje określone pliki (a zatem obejmuje określone klasy). Zamiast tego zobaczysz modyfikację pliku modułu, z tylko komentarzem do zatwierdzenia, aby zrozumieć, jaka modyfikacja została dokonana.

Podsumowując, jeśli wolisz filozofię Pythona, przejrzyj sugestie innych postów. Jeśli zamiast tego wolisz filozofię podobną do Java, utwórz plik Nib.py zawierający klasę Nib.

Stefano Borini
źródło
2
Wspomniane problemy są spowodowane ograniczeniami w edytorze i korzystaniu z narzędzi kontroli wersji, a nie językiem lub stylem programowania. Jedna klasa na plik jest szkodliwa dla struktury kodu. Użyj spyderlub podobnego edytora, aby zobaczyć podsumowanie swoich klas, ułatwiające nawigację i dwa okienka z tym samym plikiem otwartym w obu. Przeczytaj również PEP8. Python jest przeznaczony do pisania w Pythonie, a Java w Javie, ale Python nie służy do pisania w Javie.
Ioannis Filippidis
6
@IoannisFilippidis: Gdybym musiał umieścić wszystkie klasy dla modułu w jednym pliku o rozmiarach kodu, którymi normalnie zarządzam, nie byłbym nawet w stanie otworzyć pliku, kolizje z innymi kolegami gwałtownie wzrosłyby, a mój szef splunąłby mi w twarz (w przenośni, to wszystko) za jej zaproponowanie. Podejście oparte na jednym pliku nie jest skalowane, PEP-8 lub nie.
Stefano Borini
3
@StefanoBorini: PEP8 nie wymaga podejścia opartego na jednym pliku. Jedna klasa na moduł i jeden plik na (jednostkę kodu) to dwie skrajności bardzo szerokiego spektrum. Jeśli widzisz niemożliwe do zarządzania duże rozmiary plików z jednym plikiem na moduł, być może powinieneś rozważyć zmianę swojego podejścia do dzielenia pakietu na moduły.
Chintalagiri Shashank
22

stalówka jest w porządku. W razie wątpliwości zapoznaj się z przewodnikiem po stylu języka Python.

Od PEP 8 :

Nazwy pakietów i modułów Moduły powinny mieć krótkie nazwy składające się wyłącznie z małych liter. Podkreślenia mogą być używane w nazwie modułu, jeśli poprawia to czytelność. Pakiety Pythona powinny również mieć krótkie nazwy składające się wyłącznie z małych liter, chociaż odradza się używanie podkreślenia.

Ponieważ nazwy modułów są mapowane na nazwy plików, a niektóre systemy plików nie uwzględniają wielkości liter i skracają długie nazwy, ważne jest, aby nazwy modułów były dość krótkie - nie będzie to problem w systemie Unix, ale może to być problem, gdy kod jest transportowany do starszych wersji Mac, Windows lub DOS.

Gdy moduł rozszerzający napisany w C lub C ++ ma towarzyszący moduł Pythona, który zapewnia wyższy poziom (np. Bardziej zorientowany obiektowo) interfejs, moduł C / C ++ ma na początku podkreślenie (np. _Socket).

thedz
źródło
1
uhm ... to uderza mnie w brzuch. Używam prefiksu podkreślenia w pakietach / modułach dla czegoś zupełnie innego (przeznaczone dla Monty Python odniesienie).
Stefano Borini
0

Od PEP-8: nazwy pakietów i modułów :

Moduły powinny mieć krótkie nazwy składające się wyłącznie z małych liter. Podkreślenia mogą być używane w nazwie modułu, jeśli poprawia to czytelność.

Pakiety Pythona powinny również mieć krótkie nazwy składające się wyłącznie z małych liter, chociaż odradza się stosowanie podkreślenia.

Gdy moduł rozszerzający napisany w C lub C ++ ma towarzyszący moduł Pythona, który zapewnia interfejs wyższego poziomu (np. Bardziej zorientowany obiektowo), moduł C / C ++ ma na początku podkreślenie (np. _Socket).

Ehsan
źródło
-3

Moduł foo w Pythonie byłby odpowiednikiem pliku klasy Foo w Javie

lub

Moduł foobar w Pythonie byłby odpowiednikiem pliku klasy FooBar w Javie

Oded Breiner
źródło