Подсказка для подклассов в Python - PullRequest
2 голосов
/ 07 ноября 2019

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

Я создал следующие классы:

class Player(ABC)
    @abstractmethod
    def some_function():
        pass

class SomeSubclass(Player):
    def some_function():
        #some meaningfull code
        pass

p1: Type[Player] = SomeSubclass()

ВВ последней строке я получаю ожидаемую ошибку типа от PyCharm:

Ожидаемый тип 'Type [Player]' вместо 'SomeSubclass'

Использую ли я неправильный Typehint или amЯ что-то пропустил?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Нет необходимости использовать Type, если ожидается, что переменная будет экземпляром, а не классом. Любой из них должен работать:

p1: Player = SomeSubclass()

Или

p1: SomeSubclass = SomeSubclass()

В качестве альтернативы, если вы хотите, чтобы p1 был классом, а не экземпляром:

p1: Type[Player] = SomeSubclass
1 голос
/ 07 ноября 2019

Вам нужно использовать объявление типа Type[X], только если вы печатаете тип (это не обычная ситуация - например, если у вас есть фабричная функция, которая принимает тип, а не экземпляр объектав качестве аргумента). Чтобы напечатать объект, просто используйте тип объекта:

p1: Player = SomeSubclass()

Обратите внимание, что даже без подсказки типа mypy автоматически сделает вывод, что p1 имеет тип SomeSubclass и, следовательно, являетсяPlayer. Вам нужно только добавить подсказку типа Player, если вы хотите явно понизить p1 до более общего типа, чтобы позже вы могли назначить ему другой подкласс.

...