为什么__all__只包含字符串对象?


问题内容

今天,我遇到了以下pylint错误:

无效所有对象(E0604):

__all__中的无效对象%r必须仅包含字符串当__all__中出现无效(非字符串)对象时使用。

我很好奇为什么直接暴露对象被认为是不正确的?


问题答案:

因为它应该是 名称 列表,而不是值列表:

如果标识符列表用星号('*')代替,则模块中定义的所有公共名称都将在该import语句发生的作用域的本地名称空间中绑定。

模块定义的 公共名称 是通过检查模块的命名空间中名为的变量来确定的__all__
如果已定义,则它必须是由该模块定义或导入的名称的字符串序列
。给出的名称__all__均被视为公开名称,必须存在。如果__all__未定义,则公共名称集将包含在模块命名空间中找到的所有名称,这些名称不以下划线字符('_')开头。__all__应该包含整个公共API。目的是避免意外导出不属于API的项目(例如在模块中导入和使用的库模块)。[语言参考]