如果您使用依賴於__class__
的零參數super super().__method__(args)
,或者在類體內部引用__class__
,則會引發此警告。
該文本實質上說的是,如果您定義了一個自定義元類並在將其傳遞到type.__new__
之前篡改了您獲得的命名空間,則需要這樣做。您需要小心,並且始終確保您在metaclass.__new__
中通過__classcell__
到type.__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
是從Issue 23722開始的最終補丁。
這樣做正確可以使用該修復這是在Python 3.6引入了一個問題,一個pull request made to Django可以看到的例子:
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)
的__classcell__
被簡單地添加到新的命名空間被傳遞到前type.__new__
。
一些想法:這個補丁有正確的關鍵詞(我不知道這個補丁是否成功):http://bugs.python.org/file44533/classcell.patch –