Заметьте, что `__init__` получает аргумент типа, объявленного в переменной класса - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь реализовать подсказку типа для ситуаций, когда у нас есть класс Base, который реализует метод __init__ и ожидает некоторый obj типа Base.obj_type, а в подклассах ожидает тип SubClass.obj_type

Примерно так:

class Base:
    obj_type = int

    def __init__(self, obj: 'obj_type'):
        self.obj = obj


class A(Base):
    object_type = str



A(1). # I want to get type check error here, because A expect str type for obj

Я могу добиться этого, переопределив __init__ в подклассе, но есть другой способ получить это? Спасибо за вашу помощь!

UPD. Одно из возможных решений, которое я нашел на основе typing.Generic. Но, к сожалению, это не принудительная проверка типов в PyCharm, только mypy правильно ее понимают.

import typing as t

T = t.TypeVar("T")

class Base(t.Generic[T]):
    def __init__(self, obj: T):
        self.obj = obj

class A(Base[str]):
    pass

a = A(1)

ошибка mypy: error: Argument 1 to "A" has incompatible type "int"; expected "str"

...