“__module__”是否保证在 class 创建期间被定义?
Is "__module__" guaranteed to be defined during class creation?
我正在阅读一些基本如下所示的代码:
class Foo(object):
class_name = __module__.replace('_', '-')
对我来说,那看起来真的很奇怪(__module__
,那是什么?)所以我去看了 python data-model。快速搜索显示 __module__
是 class 对象和函数对象的 属性。但是,全局命名空间中没有 __module__
可用(只需尝试查看它并观察结果的 NameError
即可轻松验证...)。
我决定将此归因于特定于实现的行为,但作为最后的检查,我决定使用手边的其他实现进行测试。原来这段代码是用1
执行的
- Cpython2.7.6
- Cpython3.4.0
- jython 2.5.3
- PyPy 2.2.1 (Python 2.7.3)
我的问题是这种行为是否真的在语言参考中的任何地方定义过。我不确定我为什么要这样做,但是我可以安全地依赖 __module__
在 class 创建命名空间中,还是所有的实现者都决定以同样的方式这样做?
1所有 linux,但我怀疑这是否重要...
文档确实定义了 classes 将具有 __module__
属性。看起来 CPython 这样做的方式是它在 class 块的开头定义了一个局部变量 __module__
。这个变量然后变成一个 class 属性,就像在那里定义的任何其他变量一样。
我找不到任何说明 __module__
必须以这种方式定义的文档。特别是,我找不到任何文档明确说明该属性必须在 class 主体中定义为局部变量,而不是在 [= 的稍后阶段被分配为 class 属性21=] 创造。 This answer to a different question mentions that it works this way, and shows how it appears in the bytecode. There was a Jython bug 他们通过使其与 CPython 一样工作来修复。
我猜这是一个 CPython 实现细节,它被转移到其他实现中。据我所知,文档实际上并没有说 __module__
必须在 class 体内可用,仅在之后的 class 对象上可用。
我正在阅读一些基本如下所示的代码:
class Foo(object):
class_name = __module__.replace('_', '-')
对我来说,那看起来真的很奇怪(__module__
,那是什么?)所以我去看了 python data-model。快速搜索显示 __module__
是 class 对象和函数对象的 属性。但是,全局命名空间中没有 __module__
可用(只需尝试查看它并观察结果的 NameError
即可轻松验证...)。
我决定将此归因于特定于实现的行为,但作为最后的检查,我决定使用手边的其他实现进行测试。原来这段代码是用1
执行的- Cpython2.7.6
- Cpython3.4.0
- jython 2.5.3
- PyPy 2.2.1 (Python 2.7.3)
我的问题是这种行为是否真的在语言参考中的任何地方定义过。我不确定我为什么要这样做,但是我可以安全地依赖 __module__
在 class 创建命名空间中,还是所有的实现者都决定以同样的方式这样做?
1所有 linux,但我怀疑这是否重要...
文档确实定义了 classes 将具有 __module__
属性。看起来 CPython 这样做的方式是它在 class 块的开头定义了一个局部变量 __module__
。这个变量然后变成一个 class 属性,就像在那里定义的任何其他变量一样。
我找不到任何说明 __module__
必须以这种方式定义的文档。特别是,我找不到任何文档明确说明该属性必须在 class 主体中定义为局部变量,而不是在 [= 的稍后阶段被分配为 class 属性21=] 创造。 This answer to a different question mentions that it works this way, and shows how it appears in the bytecode. There was a Jython bug 他们通过使其与 CPython 一样工作来修复。
我猜这是一个 CPython 实现细节,它被转移到其他实现中。据我所知,文档实际上并没有说 __module__
必须在 class 体内可用,仅在之后的 class 对象上可用。