它记录了definition order in classes is preserved(另见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
据推测,模块命名空间也使用下面的紧凑dict,或者它可能是因为type(foo_bar)
是<class 'module'>
,它必须也像任何其他类一样尊重定义顺序。但是,我不确定这是否是Python保证的功能,或者只是CPython实现细节。 模块中的名称是否需要遵守定义排序?
答案 0 :(得分:2)
内置类,如module
类,不要通过正常机制用户定义的类做 * ,因此,不要利用metaclass.__prepare__
。 PEP 520
不适用于它们,因此无法在此处应用它所提供的保证。
由于字典是按顺序插入的,因此目前保留了模块命名空间的顺序,因此,与字典本身一样,它被视为实现细节。
* 用户定义的类首先通过build_class
LOAD_BUILD_CLASS
(在dis
类语句中加载bltinmodule.c
字节码的函数)type_prepare
。这是唯一__prepare__
is invoked {returns a PyDict_New
来自__prepare__
的{{1}}如果定义了Environment.getExternalStorageDirectory().toString() + "/TesseractSample/";
的{{1}}