这篇文章讨论了Python的from <module> import *
和from <package> import *
,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意。
from <module> import * means
意味着“我希望能访问<module>
中我有权限访问的全部名称”。例如以下代码something.py
:
在Python解释器中,我们可以执行from something import *
,然后看到如下的内容:
from something import *
从something
中导入了除了以_
开头名称外的其他所有名称,按照规范,_
开始的名称是私有的所以未被导入。
上面没提到__all__
是什么。__all__
是一个字符串列表,指定了当from <module> import *
被使用时,模块(或者如后文会提到的包)中的哪些符号会被导出。如果我们不定义__all__
(我们在上面的something.py
就没定义),import *
默认的导入方式是导入除了下划线(_
)开头的所有名称。再说一次,编程惯例上下划线表示一个符号是私有的,不导入是合理的。让我们来看看在something.py
中定义我们自己的__all__
会发生什么。
现在,我们期望from something import *
只会导入_private_variable
和PublicClass
:
当从一个包中导入全部时,__all__
的做法和模块基本一样,不过它处理的是包中的模块(而不是把模块中的名都导入)。所以当我们使用from <package> import *.
时__all__
说明了所有需要被导入当前命名空间的模块。
不同之处在于,如果你在一个包的__init__.py
里面没有声明__all__
,from <package> import *
语句不会导入任何东西(