python - 定义顺序在模块命名空间中可用吗?

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

据记载,definition order in classes is preserved (另见 PEP 520 ):

If the metaclass has no __prepare__ attribute, then the class namespace is initialised as an empty ordered mapping.

定义顺序是否也保留在模块对象中?

# 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(LOAD_BUILD_CLASS 字节码函数在您dis bltinmodule.c 中的类语句)。这是唯一 __prepare__ is invoked 的地方(如果未定义带有 __prepare__ 的自定义元数据,则来自 type_preparereturns a PyDict_New)。

关于python - 定义顺序在模块命名空间中可用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798961/

相关文章:

python - 将 Spark Dataframe 中的 float 列转换为 VectorUDT

python - 如何禁用对文本小部件的输入但允许编程输入?

python - 如何使用 python 和 pysftp 从一个 SFTP 流式传输到另一个 SFTP

python-3.x - fnmatch 不显示所有匹配的文件名

django:mysql:error(1045, "Access denied for user ' root' @'localhost' (使用密码: NO)")

python - 如何在 Pyramid 中使用 SQLAlchemy HSTORE?

python - 使用 insort(lst,ele) 时函数不返回值

Python/C-API : Add class to module

python - python 3.4 的正则表达式

python : Overriding a method from a third-party module (Tkinter)?