Python 可以在模块级别暴露接口
__all__ = ["foo", "bar"]
很多时候这么做还是很有好处的……
提供了哪些是公开接口的约定
不像 Ruby 或者 Java,Python 没有语言原生的可见性控制,而是靠一套需要大家自觉遵守的“约定”下工作。比如下划线开头的应该对外部不可见。同样,__all__
也是对于模块公开接口的一种约定,比起下划线,__all__
提供了暴露接口用的“白名单”。一些不以下划线开头的变量(比如从其他地方import 到当前模块的成员)可以同样被排除出去。
import os
import sys
__all__ = ["process_xxx"] # 排除了'os'和'sys'
def process_xxx():
pass # omit
总而言之:
python模块中的
__all__
属性,可用于模块导入时限制,如:
from module import *
此时被导入模块若定义了__all__
属性,则只有__all__
内指定的属性、方法、类可被导入。
若没定义,则导入模块内的所有公有属性,方法和类。
建议
按照 PEP8 建议的风格,__all__
应该写在所有 import 语句下面,和函数、常量等模块成员定义的上面。
如果一个模块需要暴露的接口改动频繁,__all__
可以这样定义:
__all__ = [
"foo",
"bar",
"egg",
]
最后多出来的逗号在 Python 中是允许的,也是符合 PEP8 风格的。这样修改一个接口的暴露就只修改一行,方便版本控制的时候看 diff。