不知道应该叫什么的标题
Python对语法的约束性非常弱,大部分情况下,都是靠约定来做约束。比如下划线开头的应该对外部不可见。同样,all 也是对于模块公开接口的一种约定,比起下划线,all 提供了暴露接口用的”白名单“。一些不以下划线开头的变量(比如从其他地方 import 到当前模块的成员)可以同样被排除出去。
例如标准库中的_abcoll.py
__all__ = ["Hashable", "Iterable", "Iterator",
"Sized", "Container", "Callable",
"Set", "MutableSet",
"Mapping", "MutableMapping",
"MappingView", "KeysView", "ItemsView", "ValuesView",
"Sequence", "MutableSequence",
]
作用是:
- 控制 from xxx import * 的行为
- 为 lint 工具提供辅助
定义 all 需要注意的地方
- 如上所述,all 应该是 list 类型的
- 不应该动态生成 all,比如使用列表解析式。all 的作用就是定义公开接口,如果不以字面量的形式显式写出来,就失去意义了。
- 即使有了 all 也不应该在非临时代码中使用 from xxx import * 语法
- 按照 PEP8 建议的风格,all 应该写在所有 import 语句下面,和函数、常量等模块成员定义的上面。
网友评论