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

=============Dlaczego występuje różnica między "importem" a "importowaniem *"?

~ $ 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' 
>>> 

Odpowiedz

21

Zmienne z wiodącym "_" (podkreślenia) nie są nazwy publiczne i nie zostaną zaimportowane, gdy jest używany from x import * .

Tutaj, _test i __test nie są publicznych nazw.

Z opisu import oświadczenie:

Jeśli lista identyfikatorów otrzymuje gwiazdką („*”), wszystkie nazwy publiczne zdefiniowane w module są związane w lokalnej przestrzeni nazw importować oświadczenie ..

nazwy publiczne zdefiniowane przez moduł są określane poprzez sprawdzanie nazw tego modułu dla zmiennej nazwie __all__; jeśli jest zdefiniowany, musi być ciągiem znaków, które są zdefiniowane lub zaimportowane przez ten moduł przez nazwy . Nazwy podane w __all__ są wszystkie uważane za publiczne i są wymagane do istnieją. Jeśli parametr __all__ nie jest zdefiniowany, zestaw nazw publicznych zawiera wszystkie nazwy znalezione w przestrzeni nazw modułu, które nie zaczynają się od znaku podkreślenia ("_"). __all__ powinien zawierać cały publiczny interfejs API. Jest to mające na celu uniknięcie przypadkowego wyeksportowania elementów, które nie są częścią interfejsu API (takich jak moduły biblioteczne, które zostały zaimportowane i użyte w module ).

Powiązane problemy