Пиланс: «ClassVar» не допускается в этом контексте?

#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"]