据记载,类中的定义顺序被保留(另见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 的实现细节。 模块中的名称是否需要遵守定义顺序?