1. 背景
最近看了一些代码,发现有些python文件在import 下面声明 __all__,查阅资料了解其含义。
2. 含义
- 约定公开接口 : 可以清晰明了的知道该文件暴露的接口, 约定成俗的调用该接口。
-
限制该行为
from XXX import *
: code当中不建议使用from xxx import *
的写法的,但线下调试的时候经常用到。如果模块中没有定义 __all__,执行 from XXX import * 的时候会将模块中非下划线开头的成员都导入当前命名空间中,这样就有可能弄脏当前命名空间, 调试容易产生问题。如果显式声明了 __all__,import * 就只会导入 __all__ 列出的成员。但它只对
import *起作用,对from XXX import XXX不起作用。
3. 用例
被测文件test.py
__all__ = ['a',
'b',
'run',]
a = 'aaa'
b = 'bbb'
c = 'ccc'
def run():
print 'Run the function.'
测试结果
- 只能导入__all__声明的变量或函数
- 对
from test import c
无效
test 1:
In [1]: from test import *
In [2]: print a
aaa
In [3]: print b
bbb
In [4]: run
Out[4]: <function test.run>
In [5]: run()
Run the function.
In [6]: print c
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-1b1d2b33e8c2> in <module>()
----> 1 print c
NameError: name 'c' is not defined
test 2:
In [7]: from test import c
In [8]: print c
ccc
注意
- __all__ 是
list
类型, 不要写表达式 - 按照 PEP8 建议的风格,__all__ 应该写在所有 import 语句下面,和函数、常量等模块成员定义的上面
- 正式代码中尽量不要使用
from XXX import *
网友评论