为什么“import”与“import *”存在差异?

时间:2009-08-19 04:08:36

标签: python import

"""module a.py"""
test = "I am test"
_test = "I am _test"
__test = "I am __test"

=============

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

1 个答案:

答案 0 :(得分:21)

带有前导“_”(下划线)的变量不是公共名称,并且在使用from x import *时不会导入。

此处,_test__test不是公开名称。

来自import声明说明:

  

如果替换了标识符列表   一个明星('*'),所有公共名称   在模块中定义的绑定   导入的本地命名空间   声明..

     

模块定义的公共名称   通过检查确定   模块的变量名称空间   名为__all__;如果定义,它必须是   一系列名称的字符串   由该模块定义或导入。   __all__中给出的名称都是   被视为公开并被要求   存在。 如果未定义__all__,则为   公共名称集包括所有名称   在模块的命名空间中找到了哪个   不要以下划线开头   字符('_')。 __all__应该   包含整个公共API。它是   意图避免意外   导出不属于的项目   API(例如库模块)   是进口和使用的   模块)。