在模块 __all__ 中使用列表而不是元组

Pro*_*014 15 python tuples list python-import python-3.x

在许多大型项目中,甚至在Django等项目中,以及在官方 Python 文档中,使用 list 列出文件中“可从外部获得”的模块组件__init__.py

__all__ = [foo, bar, other]
Run Code Online (Sandbox Code Playgroud)

然而,记录

__all__ = (foo, bar, other)
Run Code Online (Sandbox Code Playgroud)

它也会起作用,理论上它不会显着提高代码性能。

为什么,那就用它来列出?

也许有一些我不知道的神奇 PEP?

Mis*_*agi 13

list使用或没有任何约束力的理由tuple然而,惯用地表示相同类型的项目list的序列,但表示不同类型的项目的序列。tuple这也是由类型提示编码的,类型提示list[str | int]内部有一些但位置字段tuple[str, int, int]

因此,list更准确地表示“任意名称序列”。

PEP 8 反复提到是__all__一个列表:

为了更好地支持自省,模块应使用属性在其公共 API 中显式声明名称__all__。设置__all__空列表表示该模块没有公共 API。

"""This is the example module.

This module does stuff.
"""
...
__all__ = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

  • 您所描述的差异更多的是传统/有意的性质。两者之间的主要事实差异是可变性。 (7认同)
  • @Michael [“元组是不可变的,通常包含通过解包(见本节后面)或索引(甚至在命名元组的情况下通过属性)访问的异构元素序列。列表是可变的,它们的元素是通常是同类的,可以通过迭代列表来访问。”](https://docs.python.org/3/tutorial/datastructs.html#tuples-and-sequences) (2认同)

mkr*_*er1 8

语言参考说:

\n
\n

模块定义的公共名称是通过检查 module\xe2\x80\x99s 命名空间中名为 的变量来确定的__all__;如果定义,它必须是由该模块定义或导入的名称的字符串序列。

\n
\n

序列是支持迭代 ( ) 和使用整数索引 ( ) 访问的东西。所以它可以是一个列表,也可以是一个元组。for x in __all____all__[i]

\n