Как использовать __getitem__ в классе, продолжая печатать / mypy happy - PullRequest
0 голосов
/ 16 июня 2020

Я моделирую проблему, в которой нет смысла иметь экземпляры класса - в данном случае таблица periodi c. Я хочу иметь возможность проиндексировать таблицу periodi c с помощью int и получить связанный элемент (из числа atomi c; объекты элементов хранятся как переменные класса). Я могу легко сделать это с помощью метаклассов, но mypy это не нравится. Вот мой подход:

class PeriodicTableBase(type):
    def __getitem__(cls, x: int) -> int:
        return x

class PeriodicTable(metaclass=PeriodicTableBase):
    pass

a = PeriodicTable[1]

и после нахождения PEP560:

class PeriodicTable:
    def __class_getitem__(cls, x: int) -> int:
        return x

a = PeriodicTable[1]

Mypy выдает одну и ту же ошибку для обоих из них (предположительно, потому что они сталкиваются со способом generi c типов определены):

Typing.py:9: error: "PeriodicTable" expects no type arguments, but 1 given
Typing.py:9: error: Invalid type: try using Literal[1] instead?

Конечно, они оба работают во время выполнения.

Есть ли способ сделать это аккуратно, при этом оставив mypy счастливым?

...