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

时间:2017-03-15 00:18:51

标签: python python-module python-3.6 python-datamodel

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

1 个答案:

答案 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}}

}的地方。