6

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

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

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

# 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 的实现细节。 模块中的名称是否需要遵守定义顺序?

4

1 回答 1

2

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

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


*用户定义build_class的类LOAD_BUILD_CLASS首先disbltinmodule.c. 这是唯一__prepare__被调用的地方(如果未定义带有 a 的自定义元,则返回 aPyDict_New from )。type_prepare__prepare__

于 2017-03-17T12:37:19.017 回答