2012-04-07 1 views
5

stavo leggendo il sourcode per un progetto di pitone e sono imbattuto nel seguente riga:Python oggetto importazione che ha origine in un unico modulo da un modulo diverso in un terzo modulo

from couchexport.export import Format 

(fonte: https://github.com/wbnigeria/couchexport/blob/master/couchexport/views.py#L1)

Sono andato a couchexport/export.py per vedere cosa Format era (Classe? Dict? Qualcos'altro?). Sfortunatamente Format non è in quel file. export.py importa tuttavia un Format da couchexport.models dove è una classe Format (fonte: https://github.com/wbnigeria/couchexport/blob/master/couchexport/models.py#L11).

Quando apro il file originale nel mio IDE e ho cercato la dichiarazione, nella riga che ho menzionato all'inizio di questa domanda, porta direttamente a models.py.

Cosa sta succedendo? Come può un'importazione da un file (export.py) essere effettivamente un'importazione da un altro file (models.py) senza essere esplicitamente indicato?

risposta

16

Se il modulo a fa un from b import Foo, poi Foo è un membro di a dopo e accessibile come a.Foo. È solo ora che puoi importarlo anche usando from a import Foo.

Questo è comunemente usato se si dispone di una grande libreria distribuita su più file e si desidera che siano accessibili da una singola posizione. Diciamo che dispone di un pacchetto foo con la seguente disposizione:

foo/ 
    a.py 
    b.py 
    c.py 
    __init__.py 

a.py, b.py, c.py, definire le classi A, B e C, rispettivamente.

Se si voleva utilizzare tali classi, che normalmente si deve scrivere

from foo.a import A 
from foo.b import B 
from foo.c import C 

Questo ha almeno due problemi:

    è necessaria
  1. Gran parte del codice (tre righe) per questo semplice import
  2. L'autore della libreria non può più modificare l'associazione file/classe in seguito, poiché ciò interromperà il codice esistente.

Quindi, normalmente basta mettere quanto segue nel __init__.py:

from a import A 
from b import B 
from c import C 

Ora è mettere tutti i pezzi insieme in un unico luogo e tutte le classi sono accessibili con una sola importazione:

from foo import A,B,C 
+0

Non sono sicuro del problema n. 1. – DSM

+0

@DSM: chiarito :) –

+0

Ho pensato che potesse essere un idioma non tradotto ma dato che 'type' significa anche qualcosa in Python non ne ero sicuro. : ^) – DSM