Python-Namenskonventionen für Module

101

Ich habe ein Modul, dessen Zweck es ist, eine Klasse namens "nib" zu definieren. (und einige verwandte Klassen auch.) Wie soll ich das Modul selbst aufrufen? "Feder"? "Nibmodul"? Noch etwas?

Ram Rachum
quelle

Antworten:

110

Nur Feder. Benennen Sie die Klasse Nib mit einem Großbuchstaben N. Weitere Informationen zu Namenskonventionen und anderen Stilhinweisen finden Sie in PEP 8 , dem Python-Styleguide.

Stephan202
quelle
2
Folgen die meisten Python-Projekte dieser Konvention? Weil ich bemerke, dass die eingebauten Klassen in Kleinbuchstaben geschrieben sind, z. B. Liste, Zeichenfolge usw.
Ram Rachum
4
Ihre Beobachtung bezüglich der eingebauten Typen ist korrekt. Dies sind jedoch entschieden Ausnahmen. Die meisten anderen in der Standardbibliothek definierten Klassen werden großgeschrieben.
Stephan202
2
Ich dachte, dies sei die richtige Konvention, aber es gibt ein inhärentes Problem, zumindest scheint es mir. Angenommen, ich habe eine Klasse namens Client, und verständlicherweise mache ich oft Instanzen davon, die ich anrufen möchte client. Aber gemäß Ihrer Konvention wäre der Modulname client, und so müsste ich meine Instanzen immer so unnatürlich benennen client_instance. Was halten Sie von diesem Problem?
Ray
3
@ Ray Aber sagen wir, die Konvention Clientwürde das Modul benennen , dann würde es mit dem Klassennamen kollidieren Client. Da es nur drei mögliche Namensgebung ist Varianten ( client, Clientoder CLIENT) immer ein Zusammenstoß zwischen zwei Instanzen, Klassen, Module oder Konstanten sein wird. Ich glaube, Sie benennen Ihr Modul seltener genauso wie eine Instanz oder Konstante als die Klasse und sind daher die bessere Namenskonvention für die anderen Möglichkeiten. Außerdem wird der Import aus Modulen besser lesbar, da Sie im Allgemeinen Klassen und Konstanten anstelle von Variablen importieren.
Ted Klein Bergman
2
Der Grund, warum Builtins in Kleinbuchstaben geschrieben werden, besteht darin, dass sie in C und nicht in Python implementiert sind.
Har
41

Ich würde es nib.py nennen. Und ich würde auch die Klasse Feder nennen.

In einem größeren Python-Projekt, an dem ich arbeite, haben wir viele Module, die im Grunde eine wichtige Klasse definieren. Klassen werden beginnend mit einem Großbuchstaben benannt. Die Module werden wie die Klasse in Kleinbuchstaben benannt. Dies führt zu Importen wie den folgenden:

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

Es ist ein bisschen wie das Emulieren des Java-Weges. Eine Klasse pro Datei. Mit der zusätzlichen Flexibilität können Sie einer einzelnen Datei immer eine weitere Klasse hinzufügen, wenn dies sinnvoll ist.

Rincewind
quelle
27

Ich weiß, dass meine Lösung aus pythonischer Sicht nicht sehr beliebt ist, aber ich bevorzuge den Java-Ansatz eines Moduls -> einer Klasse, wobei das Modul als Klasse bezeichnet wird. Ich verstehe den Grund für den Python-Stil, aber ich mag es nicht, eine sehr große Datei mit vielen Klassen zu haben. Ich finde es schwierig zu stöbern, trotz Falten.

Ein weiterer Grund ist die Versionskontrolle: Wenn Sie eine große Datei haben, konzentrieren sich Ihre Commits in der Regel auf diese Datei. Dies kann möglicherweise dazu führen, dass mehr Konflikte gelöst werden müssen. Sie verlieren auch die zusätzlichen Protokollinformationen, die durch Ihr Commit bestimmte Dateien ändern (daher bestimmte Klassen betreffen). Stattdessen wird eine Änderung an der Moduldatei angezeigt, wobei nur der Commit-Kommentar angezeigt wird, um zu verstehen, welche Änderung vorgenommen wurde.

Wenn Sie die Python-Philosophie bevorzugen, lesen Sie zusammenfassend die Vorschläge der anderen Beiträge. Wenn Sie stattdessen die Java-ähnliche Philosophie bevorzugen, erstellen Sie eine Nib.py mit der Klasse Nib.

Stefano Borini
quelle
1
Die genannten Probleme werden durch Einschränkungen im Editor und bei der Verwendung von Tools zur Versionskontrolle verursacht, nicht durch die Sprache oder den Programmierstil. Eine Klasse pro Datei wirkt sich nachteilig auf die Codestruktur aus. Verwenden Sie spyderoder einen ähnlichen Editor, um eine Zusammenfassung Ihrer Klassen anzuzeigen, um die Navigation zu erleichtern, und zwei Fenster mit derselben Datei, die auf beiden geöffnet sind. Bitte lesen Sie auch PEP8. Python dient zum Schreiben von Python und Java für Java, Python jedoch nicht zum Schreiben von Java.
Ioannis Filippidis
5
@IoannisFilippidis: Wenn ich alle Klassen für ein Modul in einer einzigen Datei in den von mir normalerweise verwalteten Codegrößen zusammenfassen müsste, könnte ich die Datei nicht einmal öffnen, Kollisionen mit anderen Kollegen würden in die Höhe schnellen und mein Chef würde in meine spucken Gesicht (im übertragenen Sinne, das ist es) für den Vorschlag. Ein einzelner Dateiansatz skaliert nicht, PEP-8 oder nicht.
Stefano Borini
2
@StefanoBorini: PEP8 erfordert keinen Ansatz für eine einzelne Datei. Eine Klasse pro Modul und eine Datei pro (Codeeinheit) sind zwei Extreme eines sehr breiten Spektrums. Wenn Sie unüberschaubar große Dateigrößen mit einer Datei pro Modul sehen, sollten Sie möglicherweise überlegen, Ihren Ansatz zur Aufteilung eines Pakets in Module zu überarbeiten.
Chintalagiri Shashank
22

Feder ist in Ordnung. Im Zweifelsfall lesen Sie den Python-Styleguide.

Aus PEP 8 :

Paket- und Modulnamen Module sollten kurze Namen in Kleinbuchstaben haben. Unterstriche können im Modulnamen verwendet werden, wenn dies die Lesbarkeit verbessert. Python-Pakete sollten auch kurze Namen in Kleinbuchstaben enthalten, obwohl von der Verwendung von Unterstrichen abgeraten wird.

Da Modulnamen Dateinamen zugeordnet werden und bei einigen Dateisystemen die Groß- und Kleinschreibung nicht berücksichtigt wird und lange Namen abgeschnitten werden, ist es wichtig, dass die Modulnamen relativ kurz gewählt werden - dies ist unter Unix kein Problem, kann aber ein Problem sein Problem, wenn der Code zu älteren Mac- oder Windows-Versionen oder DOS transportiert wird.

Wenn ein in C oder C ++ geschriebenes Erweiterungsmodul über ein zugehöriges Python-Modul verfügt, das eine übergeordnete (z. B. objektorientiertere) Schnittstelle bietet, hat das C / C ++ - Modul einen führenden Unterstrich (z. B. _socket).

thedz
quelle
1
ähm ... das trifft mich im Bauch. Ich verwende das Unterstrichpräfix in Paketen / Modulen für etwas völlig anderes (Monty Python-Referenz beabsichtigt).
Stefano Borini
0

Aus PEP-8: Paket- und Modulnamen :

Module sollten kurze Namen in Kleinbuchstaben haben. Unterstriche können im Modulnamen verwendet werden, wenn dies die Lesbarkeit verbessert.

Python-Pakete sollten auch kurze Namen in Kleinbuchstaben enthalten, obwohl von der Verwendung von Unterstrichen abgeraten wird.

Wenn ein in C oder C ++ geschriebenes Erweiterungsmodul über ein zugehöriges Python-Modul verfügt, das eine übergeordnete (z. B. objektorientiertere) Schnittstelle bietet, hat das C / C ++ - Modul einen führenden Unterstrich (z. B. _socket).

Ehsan
quelle
-3

Das foo- Modul in Python entspricht einer Foo- Klassendatei in Java

oder

Das foobar- Modul in Python entspricht einer FooBar- Klassendatei in Java

Oded Breiner
quelle