据记载,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_prepare
的 returns a PyDict_New
)。
关于python - 定义顺序在模块命名空间中可用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798961/