记录了类中的定义顺序(另请参见PEP 520):
如果Metaclass没有
__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实施细节。是否需要模块中的名称才能尊重定义排序?
内置类,例如module
类,请勿浏览普通机制用户定义的类do *,因此,不要使用metaclass.__prepare__
。PEP 520
不适用于它们,因此保证它扩展在此处无法应用。
由于字典被插入订单,因此当前保留了模块名称空间的顺序,因此像词典本身一样被视为实现细节。
*用户定义的类首先通过build_class
(dis
A a class语句)在bltinmodule.c
中进行LOAD_BUILD_CLASS
字节bytecode加载。这是调用__prepare__
的唯一位置(如果未定义具有__prepare__
的自定义元数据,则从type_prepare
返回PyDict_New
)。