__all__

不知道应该叫什么的标题

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 语句下面,和函数、常量等模块成员定义的上面。

你可能感兴趣的:(__all__)