PyCharm предупреждает «неразрешенную ссылку на атрибут» при использовании __subclasses __ (), несмотря на то, что атрибут определен в базовом классе - PullRequest
2 голосов
/ 23 сентября 2019

Выполнение следующего:

class Base:
    x = 1

class A(Base):
    pass

y = Base.__subclasses__()[0].x

производит y=1, как и ожидалось.Однако PyCharm предупреждает меня о последней строке:

PyCharm screenshot

Поскольку все подклассы наследуются от Base, они должны содержать атрибут x, поэтому я подумал, что это будет очевидно для PyCharmразрешить x.Мое первоначальное намерение с этим кодом было перебрать все подклассы и найти тот с соответствующим значением атрибута.Я искал похожие вопросы, но не смог придумать ничего лучшего.

Что мне не хватает, и как мне изменить мой код?

1 Ответ

1 голос
/ 23 сентября 2019

В этом случае: просто проигнорируйте это предупреждение.

Я часто обнаруживал, что PyCharm не очень хорош с метаклассами - и __subclasses__ - это метод метакласса.

В вашем конкретном случае: PyCharm использует типизированные с следующим определением :

class type(object):
    ...
    def __subclasses__(self: _TT) -> List[_TT]: ...
    ...

Однако PyCharm каким-то образом разрешает это в вашем примере до List[type] вместо правильногоList[Base].Таким образом, Base.__subclasses__()[0] имеет «выведенный тип» type, и поскольку type не имеет атрибута x, он сообщает о доступе как о «неразрешенном».

Но это недостаток PyCharm, а не ваш код.

...