wim*_*wim 6 python python-module python-datamodel python-3.6
如果元类没有
__prepare__属性,则将类命名空间初始化为空有序映射.
定义顺序是否也保留在模块对象中?
# foo_bar.py
def foo():
pass
def bar():
pass
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上面的模块(也交换了顺序),它似乎确实可靠:
>>> import foo_bar
>>> for name in foo_bar.__dict__:
... if not name.startswith('_'):
... print(name)
...
foo
bar
Run Code Online (Sandbox Code Playgroud)
据推测,该模块命名空间还采用了紧凑字典底下,或者从一个事实,即遵循type(foo_bar)是<class 'module'>,它也必须尊重定义顺序,像任何其他类.但是,我不确定这是否是Python保证的功能,或者只是CPython实现细节. 模块中的名称是否需要遵守定义排序?
内置类与module类一样,不经历用户定义类所执行的正常机制*,因此,不使用metaclass.__prepare__. PEP 520不适用于它们,因此它提供的保证不能在此处应用。
由于字典是按插入顺序排列的,因此模块名称空间的顺序当前被保留,因此与字典本身一样,被视为实现细节。
*用户定义的类build_class首先在. 这是唯一被调用的地方(如果未定义带有 a 的自定义元,则返回a )。LOAD_BUILD_CLASSdisbltinmodule.c__prepare__PyDict_Newtype_prepare__prepare__
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |