Вывод типа для класса, полученного из Mapping - PullRequest
0 голосов
/ 09 октября 2019

У меня есть класс, реализующий MutableMapping

V = TypeVar('V')
K = TypeVar('K')
class MM(MutableMapping[K, V]):
    def __getitem__(self, k):
        return 1

    def __setitem__(self, k, v):
        pass

    def __delitem__(self, k):
        pass

    def __iter__(self):
        return iter(())

    def __len__(self):
        return 0

, который используется следующим образом:

test: MM[str, int] = MM()
test["a"] = 1
var = test["a"]

Переменная var должна иметь тип int (согласно подсказке типа), но покаpycharm говорит мне, что его тип не может быть выведен.

example

Это ошибка в pycharm или я что-то не так делаю?

Еще одна удивительная вещь заключается в том, что когда я изменяю определение класса на

MM(MutableMapping[str, V])

, Pycharm указывает, что тип var - string. Чего мне не хватает?

1 Ответ

1 голос
/ 10 октября 2019

Возможно, вам нужно добавить подсказки типа для каждого из ваших методов. Например:

from typing import MutableMapping, TypeVar, Iterator

K = TypeVar('K')
V = TypeVar('V')

class MM(MutableMapping[K, V]):
    def __getitem__(self, k: K) -> V:
        return ???

    def __setitem__(self, k: K, v: V) -> None:
        pass

    def __delitem__(self, k: K) -> None:
        pass

    def __iter__(self) -> Iterator[K]:
        return iter(())

    def __len__(self) -> int:
        return 0

Хотя я не на 100% точно знаю, как работает механизм вывода Pycharm, мне кажется разумным, что если вы оставите свои функции нетипизированными, он просто по умолчанию будет предполагать, что вы собираетесь оставитьэта функция динамически типизирована и ваши параметры / возвращаемые значения имеют тип «Любой».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...