如果您使用依赖于类体内的__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__'] = classcell
new_class = super_new(cls, name, bases, new_attrs)