2009-08-19 18 views
6
"""module a.py""" 
test = "I am test" 
_test = "I am _test" 
__test = "I am __test" 

=============Perché c'è una differenza in "import" rispetto a "import *"?

~ $ python 
Python 2.6.2 (r262:71600, Apr 16 2009, 09:17:39) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from a import * 
>>> test 
'I am test' 
>>> _test 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name '_test' is not defined 
>>> __test 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name '__test' is not defined 
>>> import a 
>>> a.test 
'I am test' 
>>> a._test 
'I am _test' 
>>> a.__test 
'I am __test' 
>>> 

risposta

21

variabili con un primario "_" (sottolineatura) non sono nomi pubblici e non verrà importato quando si utilizza from x import * .

Qui, _test e __test non sono nomi pubblici.

Dalla descrizione import dichiarazione:

Se l'elenco degli identificatori viene sostituita da una stella ('*'), tutti i nomi pubblici definiti nel modulo sono vincolati nel namespace locale del importare dichiarazione ..

I nomi pubblici definiti da un modulo sono determinate controllando namespace del modulo per una variabile denominata __all__; se definito, deve essere una sequenza di stringhe denominate definite o importate da quel modulo. I nomi indicati in __all__ sono tutti considerati pubblici e sono obbligatori a esistenti. Se __all__ non è definito, il set di nomi pubblici include tutti i nomi trovati nel namespace del modulo che non iniziano con un carattere di sottolineatura ('_'). __all__ deve contenere l'intera API pubblica. È destinato a evitare accidentalmente gli elementi di esportazione che non fanno parte di dell'API (come i moduli di libreria che sono stati importati e utilizzati da all'interno del modulo ).