Предупреждение возникает, если вы используете аргумент нуля super().__method__(args)
, который полагается на __class__
, имеющийся или ссылающийся на __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
- последний патч, который сделал его, от Issue 23722.
Пример делать это правильно, можно увидеть в pull request made to Django, который использует это, чтобы устранить проблему, которая была введена в 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)
__classcell__
просто добавляется в новое пространство имен перед передачей type.__new__
.
Некоторые идеи: этот патч имеет правильные ключевые слова (я не знаю, если это патч сделал это или нет): http://bugs.python.org/file44533/classcell.patch –