Convenzioni di denominazione Python per i moduli


102

Ho un modulo il cui scopo è definire una classe chiamata "pennino". (e anche alcune classi correlate). Come dovrei chiamare il modulo stesso? "pennino"? "Nibmodule"? Qualunque altra cosa?

Risposte:


110

Basta pennino. Assegna un nome alla classe Nib, con la N maiuscola. Per ulteriori informazioni sulle convenzioni di denominazione e altri consigli di stile, vedi PEP 8 , la guida allo stile di Python.


2
La maggior parte dei progetti Python segue questa convenzione? Perché ho notato che le classi incorporate sono in minuscolo, ad esempio elenco, stringa, ecc.
Ram Rachum

4
La tua osservazione rispetto ai tipi di build-in è corretta. Queste sono decisamente eccezioni, però. La maggior parte delle altre classi definite nella libreria standard sono in maiuscolo.
Stephan202

2
Pensavo che questa fosse la convenzione corretta, ma c'è un problema intrinseco, almeno mi sembra. Diciamo che ho chiamato un corso Cliente, comprensibilmente, spesso ne creo istanze che voglio chiamare client. Ma secondo la tua convenzione, il nome del modulo sarebbe client, quindi dovrei sempre nominare le mie istanze in modo innaturale client_instance. Cosa ne pensi di questo problema?
Ray

3
@ Ray Ma diciamo che la convenzione doveva dare un nome al modulo Client, quindi sarebbe in conflitto con il nome della classe Client. Poiché ci sono solo tre possibili varianti di denominazione ( client, Cliento CLIENT) ci sarà sempre uno scontro tra due istanze, classi, moduli o costanti. Credo che ci siano meno volte in cui nomini il tuo modulo come un'istanza o una costante rispetto alla classe, e quindi è la migliore convenzione di denominazione delle altre possibilità. Renderà anche più leggibile l'importazione dai moduli poiché generalmente importi classi e costanti piuttosto che variabili.
Ted Klein Bergman

2
Il motivo per cui i builtin sono minuscoli è implicare che siano implementati in C piuttosto che in python.
Har

41

Lo chiamerei nib.py. E vorrei anche chiamare la classe Pennino.

In un progetto python più ampio su cui sto lavorando, abbiamo molti moduli che definiscono fondamentalmente una classe importante. Le classi sono denominate che iniziano con una lettera maiuscola. I moduli sono denominati come la classe in minuscolo. Questo porta a importazioni come le seguenti:

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

È un po 'come emulare il modo Java. Una classe per file. Ma con la flessibilità aggiunta, puoi sempre aggiungere un'altra classe a un singolo file se ha senso.


27

So che la mia soluzione non è molto popolare dal punto di vista pitonico, ma preferisco usare l'approccio Java di un modulo-> una classe, con il modulo chiamato come classe. Capisco il motivo dietro lo stile python, ma non mi piace avere un file molto grande contenente molte classi. Trovo difficile navigare, nonostante la piegatura.

Un altro motivo è il controllo della versione: avere un file di grandi dimensioni significa che i tuoi commit tendono a concentrarsi su quel file. Questo può potenzialmente portare a una maggiore quantità di conflitti da risolvere. Perdi anche le informazioni di registro aggiuntive che il tuo commit modifica file specifici (quindi coinvolgendo classi specifiche). Invece vedi una modifica al file del modulo, con solo il commento di commit per capire quale modifica è stata fatta.

Riassumendo, se preferisci la filosofia python, vai per i suggerimenti degli altri post. Se invece preferisci la filosofia java-like, crea un Nib.py contenente la classe Nib.


1
I problemi menzionati sono causati da limitazioni nell'editor e nell'uso degli strumenti di controllo della versione, non dal linguaggio o dallo stile di programmazione. Una classe per file è dannosa per la struttura del codice. Utilizzare spydero un editor simile per visualizzare un riepilogo delle classi per facilitare la navigazione e due riquadri con lo stesso file aperti su entrambi. Inoltre, leggi PEP8. Python è per scrivere Python e Java per Java, ma Python non è per scrivere Java.
Ioannis Filippidis

5
@IoannisFilippidis: Se dovessi mettere tutte le classi per un modulo in un unico file nelle dimensioni del codice che gestisco normalmente, non sarei nemmeno in grado di aprire il file, le collisioni con altri colleghi aumenterebbero alle stelle e il mio capo sputerebbe nel mio faccia (in senso figurato, questo è tutto) per proporlo. Un approccio a file singolo non è scalabile, PEP-8 o meno.
Stefano Borini

2
@StefanoBorini: PEP8 non richiede un approccio a file singolo. Una classe per modulo e un file per (unità di codice) sono due estremi di uno spettro molto ampio. Se stai vedendo file di dimensioni ingestibili con un file per modulo, dovresti forse considerare di rivedere il tuo approccio alla suddivisione di un pacchetto in moduli.
Chintalagiri Shashank,

22

il pennino va bene. In caso di dubbio, fare riferimento alla guida allo stile di Python.

Da PEP 8 :

Nomi di pacchetti e moduli I moduli dovrebbero avere nomi brevi, tutti minuscoli. È possibile utilizzare trattini di sottolineatura nel nome del modulo se migliora la leggibilità. I pacchetti Python dovrebbero anche avere nomi brevi, tutti minuscoli, sebbene sia sconsigliato l'uso di trattini bassi.

Poiché i nomi dei moduli sono mappati ai nomi dei file, e alcuni file system non fanno distinzione tra maiuscole e minuscole e troncano i nomi lunghi, è importante che i nomi dei moduli siano scelti in modo abbastanza brevi - questo non sarà un problema su Unix, ma potrebbe essere un problema quando il codice viene trasportato su versioni precedenti di Mac o Windows o DOS.

Quando un modulo di estensione scritto in C o C ++ ha un modulo Python di accompagnamento che fornisce un'interfaccia di livello superiore (ad esempio più orientata agli oggetti), il modulo C / C ++ ha un trattino basso iniziale (ad esempio _socket).


1
uhm ... questo mi colpisce allo stomaco. Sto usando il prefisso trattino basso in pacchetti / moduli per qualcosa di completamente diverso (riferimento a monty python inteso).
Stefano Borini

0

Da PEP-8: Nomi di pacchetti e moduli :

I moduli dovrebbero avere nomi brevi, tutti minuscoli. È possibile utilizzare trattini di sottolineatura nel nome del modulo se migliora la leggibilità.

I pacchetti Python dovrebbero anche avere nomi brevi, tutti minuscoli, sebbene sia sconsigliato l'uso di trattini bassi.

Quando un modulo di estensione scritto in C o C ++ ha un modulo Python di accompagnamento che fornisce un'interfaccia di livello superiore (ad esempio più orientata agli oggetti), il modulo C / C ++ ha un trattino basso iniziale (ad esempio _socket).


-3

Il modulo foo in python sarebbe l'equivalente di un file di classe Foo in Java

o

Il modulo foobar in python sarebbe l'equivalente di un file di classe FooBar in Java

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.