2012-07-31 9 views
6

Ho una struttura di pacchetto come segue:Perché gli attributi di accesso al modulo non possono essere dichiarati in __init__.py del suo pacchetto?

mypackage 
    __init__.py 
    mymodule.py 

metto alcune dichiarazioni "costanti" in __init__.py ad esempio:

DELIMITER='\x01' 

Tuttavia, il codice nel mymodule.py non può accesso DELIMITER a meno che io aggiungo:

from __init__ import * 

Verso l'alto della m ymodule.py file. Suppongo di aver perso un concetto qui. È che qualunque cosa viene dichiarata in __init__.py non viene letta in memoria fino a quando non viene acceduta tramite una dichiarazione di importazione? Inoltre, questo è un tipico tipo di cosa da inserire nel file __init__.py?

+4

Dove hai avuto l'impressione che avrebbe funzionato senza l'istruzione 'import'? –

+0

@DavidRobinson: dalla documentazione di Python. ["__init__.py Inizializza il pacchetto audio"] (http://docs.python.org/tutorial/modules.html#packages). Non so in quale altro modo avrei interpretato quello che stanno dicendo, a parte l'ipotesi che il codice in __init__.py sia inizializzato da Python. –

risposta

5

Python fa esegue il codice in __init__.py quando il pacchetto viene importato, che consente di eseguire l'inizializzazione. Tuttavia, solo perché è eseguito non significa che si abbia accesso alle variabili in esso contenute all'interno di altri moduli.

Ad esempio:

testpackage 
    __init__.py 
    testmod.py 

Diciamo __init__.py ha il codice print "Initializing __init__", e testmod.py ha print "Initializing testmod". In tal caso, l'importazione testpackage o testmod causerebbe il codice di inizializzazione da eseguire:

dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "import testpackage" 
Initializing __init__ 
dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "from testpackage import testmod" 
Initializing __init__ 
Initializing testmod 

Esso non, tuttavia, dà testmod.py accesso alle variabili da __init__.py. Questo deve essere fatto esplicitamente.

+1

Grazie. Lo capisco adesso. Non sai mai cos'è la magia e cosa non lo è fino a quando non l'hai provato una volta. :) –

2

I pacchetti non arrotolano in qualche modo tutti i moduli in essi contenuti. Non c'è motivo perché roba in __init__ sia accessibile negli altri moduli a meno che non la importi.

Problemi correlati