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

=============¿Por qué hay una diferencia en "importar" frente a "importar *"?

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

Respuesta

21

variables con una de las principales "_" (subrayado) no son nombres públicos y no se importará cuando se utiliza from x import * .

Aquí, _test y __test no son públicos nombres.

partir de la descripción import declaración:

Si la lista de identificadores se sustituye por una estrella ('*'), todos los nombres públicos definidos en el módulo están obligados en el espacio de nombres local de la importar comunicado ..

los nombres públicas definidas por un módulo se determinan mediante la comprobación de espacio de nombres del módulo para una variable __all__ llamado; si se define, debe ser una secuencia de cadenas que son nombres definidos o importados por ese módulo. Los nombres dados en __all__ son todos considerados públicos y se requiere que existan. Si __all__ no está definido, el conjunto de nombres públicos incluye todos los nombres que se encuentran en el espacio de nombres del módulo que no comienzan con un carácter de subrayado ('_'). __all__ debería contener toda la API pública. Es destinado a evitar accidentalmente exportar elementos que no son parte de API (como módulos de biblioteca que se importaron y utilizaron en el módulo ).

Cuestiones relacionadas