模块命名空间中的定义顺序是否可用?

wim*_*wim 6 python python-module python-datamodel python-3.6

据记载,中的定义顺序被保留(参见PEP 520):

如果元类没有__prepare__属性,则将类命名空间初始化为空有序映射.

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

# foo_bar.py

def foo():
    pass

def bar():
    pass
Run Code Online (Sandbox Code Playgroud)

我已经尝试了上面的模块(也交换了顺序),它似乎确实可靠:

>>> import foo_bar
>>> for name in foo_bar.__dict__:
...     if not name.startswith('_'):
...         print(name)
... 
foo
bar
Run Code Online (Sandbox Code Playgroud)

据推测,该模块命名空间还采用了紧凑字典底下,或者从一个事实,即遵循type(foo_bar)<class 'module'>,它也必须尊重定义顺序,像任何其他类.但是,我不确定这是否是Python保证的功能,或者只是CPython实现细节. 模块中的名称是否需要遵守定义排序?

Jim*_*ard 2

内置类与module类一样,不经历用户定义类所执行的正常机制*,因此,不使用metaclass.__prepare__. PEP 520不适用于它们,因此它提供的保证不能在此处应用。

由于字典是按插入顺序排列的,因此模块名称空间的顺序当前被保留,因此与字典本身一样,被视为实现细节。


*用户定义的类build_class首先在. 这是唯一被调用的地方(如果未定义带有 a 的自定义元,则返回a )。LOAD_BUILD_CLASSdisbltinmodule.c__prepare__PyDict_Newtype_prepare__prepare__