如果您使用依赖于类体内的
__class__可用或引用的super,则会发出警告
__class__。
文字实质上是说,如果您定义自定义元类并在将其传递给之前篡改所获得的名称空间,则需要这样做
type.__new__。你需要小心,始终确保你传递
__classcell__给
type.__new__你的
metaclass.__new__。
也就是说,如果您创建了一个要传递的新名称空间,请始终检查是否
__classcell__在创建的原始名称空间中定义了该名称空间并将其添加:
class Mymeta(type): def __new__(cls, name, bases, namespace): my_fancy_new_namespace = {....} if '__classcell__' in namespace: my_fancy_new_namespace['__classcell__'] = namespace['__classcell__'] return super().__new__(cls, name, bases, my_fancy_new_namespace)您在注释中链接的文件实际上是尝试发行的许多补丁程序中的第一个,
issue23722_classcell_reference_validation_v2.diff也是发出此文件的最后一个补丁程序,发行于23722。
正确执行此操作的示例可以在对Django发出的pull请求中看到,该请求使用此请求修复了Python
3.6中引入的问题:
new_attrs = {'__module__': module}classcell = attrs.pop('__classcell__', None)if classcell is not None: new_attrs['__classcell__'] = classcellnew_class = super_new(cls, name, bases, new_attrs)在
__classcell__传递之前被简单地添加到新的命名空间
type.__new__。



