Аннотация Mypy к декоратору класса

Я использую декораторы классов в Python и не могу понять, какую аннотацию типа дать моему классу, чтобы сделать mypy счастливым.

Мой код следующий:

from typing import Type
from pprint import pformat


def betterrepr(cls:Type[object]):
    """Improve representation of a class"""

    class improved_class(cls):  # line 12
        def __repr__(self) -> str:
            return f"Instance of {cls.__name__}, vars = {pformat(vars(self))}"

    return improved_class

В настоящее время у меня есть 2 следующие ошибки:

myprog.py:12: ошибка: неверный тип "cls"

myprog.py:12: ошибка: недопустимый базовый класс

Что я должен использовать для типа cls (и, кстати, Pythonic использовать это ключевое слово для класса, используемого в качестве аргумента?)?

Спасибо


person Jean-Francois T.    schedule 02.07.2019    source источник
comment
Обратите внимание, что вы можете просто изменить cls вместо того, чтобы наследовать от него.   -  person MisterMiyagi    schedule 02.07.2019
comment
cls — это каноническое имя для классов, например. в качестве первого аргумента classmethod. [...] 'cls' - предпочтительное написание для любой переменной или аргумента, который, как известно, является классом, особенно первый аргумент метода класса. из PEP8   -  person MisterMiyagi    schedule 02.07.2019


Ответы (1)


Использование аргументов функций в качестве базовых классов в настоящее время не поддерживается mypy. Единственный вариант — заглушить ошибку с помощью комментария type: ignore или фиктивного псевдонима, например base: Any = cls.

Даже без аннотации cls mypy будет правильно определять тип класса, украшенного betterrepr. Чтобы задокументировать, что ваш декоратор возвращает класс, аналогичный декорированному классу, используйте файл TypeVar.

from typing import Type, TypeVar
from pprint import pformat

T = TypeVar('T')


def betterrepr(cls: Type[T]) -> Type[T]:
    """Improve representation of a class"""
    class IClass(cls):  # type: ignore
        def __repr__(self) -> str:
            return f"Instance of {cls.__name__}, vars = {pformat(vars(self))}"
    return IClass
person MisterMiyagi    schedule 02.07.2019