gpt4 book ai didi

python - 定义顺序在模块命名空间中可用吗?

转载 作者:太空狗 更新时间:2023-10-29 21:56:16 25 4
gpt4 key购买 nike

据记载,definition order in classes is preserved (另见 PEP 520 ):

If the metaclass has no __prepare__ attribute, then the class namespace is initialised as an empty ordered mapping.

定义顺序是否也保留在模块对象中?

# foo_bar.py

def foo():
pass

def bar():
pass

我已经对上面的模块进行了试验(也交换了顺序),它看起来确实可靠:

>>> import foo_bar
>>> for name in foo_bar.__dict__:
... if not name.startswith('_'):
... print(name)
...
foo
bar

据推测,模块命名空间还在下面使用了一个紧凑的字典,或者可能是因为 type(foo_bar)<class 'module'>它也必须像任何其他类一样遵守定义顺序。但是,我不确定这是 Python 保证的功能,还是只是 CPython 的实现细节。 模块中的名称是否需要遵守定义顺序?

最佳答案

内置类,如 module 类,不通过用户定义类的正常机制 do*,因此,不使用 metaclass.__prepare__PEP 520 不适用于它们,因此它扩展的保证不能在此处应用。

模块命名空间的排序目前由于字典被插入排序而被保留,因此,就像字典本身一样,被认为是一个实现细节。


* 用户定义的类首先通过build_class(LOAD_BUILD_CLASS 字节码函数在您dis bltinmodule.c 中的类语句)。这是唯一 __prepare__ is invoked 的地方(如果未定义带有 __prepare__ 的自定义元数据,则来自 type_preparereturns a PyDict_New)。

关于python - 定义顺序在模块命名空间中可用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com