是否保证在创建类时定义"__module__"?

mgi*_*son 12 python python-internals

我正在阅读一些基本上看起来像这样的代码:

class Foo(object):
    class_name = __module__.replace('_', '-')
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来很奇怪(__module__那是什么?)所以我去了看python 数据模型.快速搜索显示这__module__是类对象和函数对象的属性.但是,__module__全局命名空间中没有可用的东西(只需要通过查看它并观察NameError结果就可以轻松验证...).

我决定将其用于实现特定的行为,但作为最后的检查,我决定使用其他实现进行测试.事实证明,此代码以1执行

  • Cpython 2.7.6
  • Cpython 3.4.0
  • jython 2.5.3
  • PyPy 2.2.1(Python 2.7.3)

我的问题是这种行为是否实际上是在语言参考中的任何地方定义的.我不确定我为什么__module__要这样做,但是我可以安全地依赖于类创建命名空间,还是所有实现者都决定以同样的方式执行此操作?

1所有linux,但我怀疑这很重要......

Bre*_*arn 8

文档定义的是类将具有__module__属性.CPython这样做的方式似乎是它__module__在类块的开头定义了一个局部变量.然后,该变量成为类别归属,就像那里定义的任何其他变量一样.

我找不到任何__module__必须以这种方式定义的文档.特别是,我找不到任何明确说明属性必须在类体中定义为局部变量的文档,而不是在类创建的后期阶段将其指定为类属性. 这个对不同问题的回答提到它以这种方式工作,并显示它在字节码中的显示方式.有一个Jython错误,他们通过使其工作与CPython相同来修复.

我猜这是一个CPython实现细节,已经转移到其他实现.据我所知,文档实际上并没有说__module__必须在类体内可用,之后只在类对象上.

  • 确切地; 在语言“规范”的任何地方都不能保证名称首先在类主体中创建。 (2认同)