2009-04-02 22 views

Antwort

95

Nur Feder. Benennen Sie die Klasse Nib mit einem Großbuchstaben N. Weitere Informationen zu Namenskonventionen und anderen Stilberatungen finden Sie unter PEP 8, dem Python-Style-Guide.

+2

Folgen die meisten Python-Projekte dieser Konvention? Weil ich bemerke, dass die eingebauten Klassen in Kleinbuchstaben sind, z.B. Liste, String, etc. –

+4

Sie Beobachtung w.r.t. Die eingebauten Typen sind korrekt. Dies sind jedoch ausgesprochene Ausnahmen. Die meisten anderen in der Standardbibliothek * definierten Klassen sind * groß geschrieben. – Stephan202

+2

Ich dachte, das wäre die richtige Konvention, aber es gibt ein inhärentes Problem damit, zumindest scheint es mir. Angenommen, ich habe eine Klasse mit dem Namen "Client", und verständlicherweise mache ich oft Instanzen, die ich "Client" nennen möchte. Aber gemäß deiner Konvention wäre der Modulname "client" und ich müsste meinen Instanzen immer etwas unnatürliches wie "client_instance" nennen. Was denkst du über dieses Problem? – Ray

34

Ich würde es nib.py nennen. Und ich würde auch die Klasse Nib 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 folgt:

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

Es ist ein bisschen wie die Java-Art zu emulieren. Eine Klasse pro Datei. Aber mit der zusätzlichen Flexibilität, dass Sie immer eine andere Klasse zu einer einzigen Datei hinzufügen können, wenn es sinnvoll ist.

21

Feder ist in Ordnung. Beziehen Sie sich im Zweifelsfall auf den Python-Style-Guide.

Von PEP 8:

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

Da Modulnamen abgebildet werden auf Dateinamen und einige Dateisysteme sind Groß- und Kleinschreibung und lange Namen abschneiden, ist es wichtig, dass Modul Namen zu recht kurz gewählt werden - das wird kein Problem auf Unix sein , aber es kann ein Problem sein, wenn der Code zu älteren Mac oder Windows-Versionen oder DOS transportiert wird.

Wenn ein Erweiterungsmodul in C oder C++ geschrieben eine begleitenden Python -Modul hat, das einen höheren Pegel liefert (z.B. mehr objektorientierter) Schnittstelle, das C/C++ Modul hat einen Unterstrich (z.B. _socket).

+1

ähm ... das trifft mich im Bauch. Ich verwende das Unterstrichpräfix in packages/modules für etwas völlig anderes (monty python reference intented). –

25

Ich weiß, dass meine Lösung aus pythonischer Sicht nicht sehr beliebt ist, aber ich bevorzuge den Java-Ansatz eines Moduls -> eine Klasse, wobei das Modul als Klasse bezeichnet wird. Ich verstehe den Grund hinter dem Python-Stil, aber ich bin nicht allzu gern mit einer sehr großen Datei, die viele Klassen enthält. Ich finde es schwierig, trotz Falten zu stöbern.

Ein weiterer Grund ist die Versionskontrolle: Wenn Sie eine große Datei haben, konzentrieren sich Ihre Commits auf diese Datei. Dies kann möglicherweise dazu führen, dass mehr Konflikte gelöst werden. Außerdem verlieren Sie die zusätzlichen Protokollinformationen, die Ihr Commit für bestimmte Dateien verwendet (also bestimmte Klassen). Stattdessen sehen Sie eine Änderung an der Moduldatei, wobei nur der Commit-Kommentar zu verstehen ist, welche Änderung vorgenommen wurde.

Zusammenfassend, wenn Sie die Python-Philosophie bevorzugen, gehen Sie für die Vorschläge der anderen Beiträge. Wenn Sie stattdessen die Java-ähnliche Philosophie bevorzugen, erstellen Sie eine Nib.py, die Klassen-Nib enthält.

+1

Die genannten Probleme werden durch Einschränkungen im Editor und in 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 'spyder' oder einen ähnlichen Editor, um eine Zusammenfassung Ihrer Klassen zu sehen, um die Navigation zu erleichtern, und zwei Fenster mit derselben Datei, die auf beiden Seiten geöffnet ist. Bitte lesen Sie auch PEP8. Python dient zum Schreiben von Python und Java für Java, aber Python ist * nicht * zum Schreiben von Java. –

+4

@IoannisFilippidis: Wenn ich alle Klassen für ein Modul in einer einzigen Datei in den Code Größen, die ich normalerweise verwalten würde, würde ich nicht einmal in der Lage sein, die Datei zu öffnen, Kollisionen mit anderen Kollegen würde in die Höhe schießen, und mein Chef würde in spucken mein Gesicht (bildlich, das ist es) für das Vorschlagen. Ein einzelner Dateiansatz skaliert nicht, PEP-8 oder nicht. –

+0

@StefanoBorini: PEP8 ruft keinen einzelnen Dateiansatz auf. Eine Klasse pro Modul und eine Datei pro (Code-Einheit) sind zwei Extreme eines sehr breiten Spektrums. Wenn Sie unübersichtlich große Dateigrößen mit einer Datei pro Modul sehen, sollten Sie vielleicht überlegen, wie Sie ein Paket in Module aufteilen. –

0

foo Modul in Python würde in Java

oder

foobar Modul in Python wäre das Äquivalent zu einer FooBar Klassendatei das entspricht einer Foo Klasse-Datei in Java