Аннотация Mypy на декоратор класса - PullRequest
1 голос
/ 02 июля 2019

Я использую декораторы классов в 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 использовать это ключевое слово для класса, используемого в качестве аргумента?)?

Спасибо

1 Ответ

2 голосов
/ 02 июля 2019

Использование аргументов функции в качестве базовых классов в настоящее время не поддерживается 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
...