2013-04-10 13 views
6

Sto creando una serie di linee guida per la codifica di Python per un team di circa 30 sviluppatori. Come base per il mio documento, finora ho studiato il Google python style guide e lo PEP 8 style guide e le informazioni incorporate da entrambi.In python, quali sono i pro e i contro dell'importazione di una classe e dell'importazione del modulo della classe?

Un luogo in cui la guida di stile di Google è più restrittiva di PEP 8 con le importazioni. La guida di Google richiede agli sviluppatori di importare solo pacchetti e moduli, quindi di fare riferimento agli articoli all'interno con un nome più qualificato. Per esempio:

from pkg import module 
... 
my_class = module.MyClass() 

La giustificazione è che la "fonte di ogni identificatore è indicato in modo coerente". Per il nostro progetto, intendiamo organizzare con pacchetti di due o tre livelli profondi, in modo da conoscere la fonte completa dell'identificatore, il lettore probabilmente dovrà esaminare comunque la dichiarazione di importazione. Mi piacerebbe sostenere questo stile di importazione come "stile preferito":

from pkg.module import MyClass 
... 
my_class = MyClass() 

IMHO, la leggibilità in costrutti Python come la list comprehension è migliorata quando i nomi sono più succinto.

Quello che non mi è chiaro è cosa potrebbe fare l'interprete Python dietro le quinte. Ad esempio, MyClass ora fa parte dello spazio dei nomi globale sia per questo modulo, sia per tutti gli importatori di questo modulo? (Questo sarebbe male, potrebbe portare a qualche bizzarro bug, se questo fosse vero, difenderei lo stile di Google).

La mia esperienza di sviluppo in Python è limitata a circa 6 mesi (e non ci sono molti esperti sul nostro progetto da consultare), quindi volevo ottenere maggiori informazioni dalla comunità. Qui ci sono alcuni elementi ho ricercato già:

effbot - discussion on imports

stack overflow - import vs. from import

python documentation - modules

python documentation - import

Grazie per le vostre risposte!

+3

* Tutto ciò * che è possibile fare riferimento è direttamente un globale nel modulo. 'MyClass' è davvero un globale nel tuo secondo esempio, nel primo,' module' è. –

+0

Faccio "import blah" e "vlah = blah.vlah". Perché intero modulo 'blah' verrebbero trattati in ogni caso, anche se ho fatto' dall'importazione bla vlah' – thkang

+0

A parte la domanda globale che Martijn risposto, eravate alla ricerca di qualcosa di diverso. In tal caso, puoi rendere la domanda più esplicita? – msw

risposta

5

In Python non esiste una variabile globale su più di un modulo. Se esegui from pkg.module import MyClass, allora MyClass si trova nello spazio dei nomi globale del modulo in cui lo fai, ma non di qualsiasi altro modulo (inclusi i moduli che importano il modulo che importa MyClass).

Per quanto riguarda la domanda più generale, il meccanismo di importazione può essere accettabile a seconda della situazione. Se il nome del modulo è lungo, è possibile ottenere un po 'di accorciamento importandolo con un nome diverso:

# Awkward 
from package import reallylongmodule 
reallylongmodule.MyClass() 

# Less awkward 
from package import reallylongmodule as rlm 
rlm.MyClass() 

Importazione solo la classe può essere bene se il nome della classe è abbastanza distintivo che si può dire da dove viene e Cos'è. Tuttavia, se si dispone di più moduli che definiscono classi con nomi relativamente poco descrittivi (ad esempio, "Processore", "Unità", "Dati", "Gestore"), allora può essere una buona idea accedervi tramite il nome del modulo per chiarire cosa stai facendo.

Le guide di stile sono in definitiva guide e non leggi. La mia preferenza sarebbe quella di scegliere un meccanismo che massimizzi la chiarezza e la leggibilità. Ciò comporta un compromesso tra l'evitamento di nomi lunghi e ingombranti e l'evitamento di nomi brevi, vaghi o criptici.Come fate che compromesso dipende dalle librerie particolari che si sta utilizzando e come si sta utilizzando loro (per esempio, quanti moduli si importa, quante cose si importa da loro).

+0

Concordato! Penso che entrambi gli stili siano a posto; era solo più preoccupato che ci fossero implicazioni sottili implicate nell'importare direttamente una classe (o una funzione). – Tom

0

suggerisco di utilizzare pedine codice automatici, come pylint, PEP8, pyflakes, invece di scrivere guide di codice.

Io personalmente preferisco usare from pkg import module, a causa di possibili collisioni di nomi.

from package import module 

def my_fun(): 
    module.function() 

Inpreter deve fare 3 ricerche hash-table namespace funzione locale, dello spazio dei nomi globale del modulo in corso e dello spazio dei nomi del modulo importato. In

from package.module import function 

def my_fun(): 
    function() 

lo farà solo 2 ricerche: l'ultimo eseguito nel tempo di importazione.

+0

Sono d'accordo sull'uso di controllori di codice automatici; l'esigenza di avere un documento proviene dai nostri clienti. Probabilmente farò di questo un elemento della linea guida! – Tom

Problemi correlati