“__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

执行的

我的问题是这种行为是否真的在语言参考中的任何地方定义过。我不确定我为什么要这样做,但是我可以安全地依赖 __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 对象上可用。