是模块名称空间中可用的定义订单



记录了类中的定义顺序(另请参见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_classdis A a class语句)在bltinmodule.c中进行LOAD_BUILD_CLASS字节bytecode加载。这是调用__prepare__的唯一位置(如果未定义具有__prepare__的自定义元数据,则从type_prepare返回PyDict_New)。

相关内容

  • 没有找到相关文章

最新更新