#python #type-hinting #python-typing #pylance
Вопрос:
Со следующей функцией:
from typing import ClassVar
def overrode_make_stub(cls: ClassVar["Emailer"]) -> bool:
return not (getattr(cls.make_stub, "_not_overridden", False))
Я получаю эту ошибку от Пиланса в коде Visual Studio:
«ClassVar» в этом контексте не допускается
Я использую Python3.9 и Pylance v2021.10.0.
В этом примере Email
класс имеет функцию «make_stub», для которой установлен _not_overriden
атрибут True
. Когда я проверяю модуль на наличие подклассов этого класса, я могу использовать это для фильтрации только тех, которые переопределили функцию «make_sub».
Я не могу найти никакой документации по этой ошибке. Кто-нибудь знает, почему это происходит?
Ответ №1:
Подсказка ClassVar
типа предназначена для обозначения переменных уровня класса, чтобы сообщить системе типов, что они действительно являются переменными класса, а не значениями по умолчанию для переменных экземпляра.
from typing import ClassVar
class Example:
x: int # x and y are being type hinted as instance variables
y: int
z: ClassVar[int] # z is being type hinted as a class variable instead
Если аргумент вашей функции должен быть классом, то вы должны использовать typing.Type
его в качестве подсказки типа. Попробуйте это, чтобы намекнуть, что вы ожидаете подкласса Emailer
:
from typing import Type
def overrode_make_stub(cls: Type["Emailer"]) -> bool:
return not (getattr(cls.make_stub, "_not_overridden", False))
Обратите внимание, что если вам нужно быть совместимым только с Python 3.9 и более поздними версиями, на самом деле вам вообще не нужно использовать typing.Type
. Вместо этого вы можете использовать встроенный type
объект, который может быть проиндексирован таким же образом, благодаря PEP 585: cls: type["Emailer"]