Python 为什么uuu all uuuu只包含字符串对象?

Python 为什么uuu all uuuu只包含字符串对象?,python,pylint,Python,Pylint,今天我遇到了以下pylint错误: 无效的所有对象(E0604): \uuuu all\uuu中的无效对象%r必须仅包含在\uuu all\uuu中出现无效(非字符串)对象时使用的字符串 我很好奇为什么直接公开对象会被认为是不正确的?如果你公开的不是字符串,Python会抛出一个异常。这就是派林给出错误的原因,因为代码不正确 文件mymodule.py: def func(): pass __all__ = [func] 现在运行: from mymodule import * 您将

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

无效的所有对象(E0604):

\uuuu all\uuu中的无效对象%r必须仅包含在\uuu all\uuu中出现无效(非字符串)对象时使用的字符串


我很好奇为什么直接公开对象会被认为是不正确的?

如果你公开的不是字符串,Python会抛出一个异常。这就是派林给出错误的原因,因为代码不正确

文件mymodule.py:

def func():
    pass
__all__ = [func]
现在运行:

from mymodule import *
您将得到一个
TypeError

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: attribute name must be string, not 'function' 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:属性名称必须是字符串,而不是“函数”
原因是,
\uuuuuuuuuuuuuuuuuuuuuuuuuu
用于命名模块对象上的属性。这就是机制的工作原理。如果你想修改Python的导入机制,这样你就可以把对象放在那里,我想你可以,但它只适用于某些类型的对象(函数和类可以工作,但常量不能工作,你不能重命名函数和类)。

因为它应该是一个名称列表,非价值观:

如果标识符列表被星号(
“*”
)替换,则模块中定义的所有公共名称都绑定在本地命名空间中,以用于执行
导入
语句的范围

通过检查模块名称空间中名为
\uuuuu all\uuuuuu
的变量来确定模块定义的公共名称如果已定义,则必须是由该模块定义或导入的名称组成的字符串序列
\uuuuuu all\uuuuu
中给出的名称都被视为公共名称,并且必须存在。如果未定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,则公用名称集包括模块<代码>\uuuuuuuuuuuuuuuuuuuuu应包含整个公共API。其目的是避免意外导出不属于API的项(例如导入并在模块中使用的库模块)。[]