Вы уверены, что ваш оригинальный фрагмент кода на самом деле проверяет тип с помощью mypy?Когда я пытаюсь запустить его, используя Mypy 0.620 или последнюю версию от github, я получаю следующие ошибки:
test.py:13: error: invalid type comment or annotation
test.py:13: note: Suggestion: use TupleType[...] instead of TupleType(...)
test.py:14: error: invalid type comment or annotation
test.py:14: note: Suggestion: use TupleType[...] instead of TupleType(...)
Я также не могу воспроизвести ошибку, которую вы получаете с вашим кодом ClassVar - когдаЯ пытаюсь запустить его, я получаю следующие ошибки:
test.py:4: error: Invalid type: ClassVar nested inside other type
test.py:6: error: Incompatible default for argument "tuptyp" (default has type "Type[str]", argument has type "Type[HomogenousTypeVar]")
test.py:12: error: Invalid type alias
test.py:13: warning: Returning Any from function declared to return "Union[Type[Tuple[HomogenousTypeVar?, ...]], Type[Tuple[HomogenousTypeVar?, ...]]]"
test.py:15: error: Name 'Thing' is not defined
test.py:16: error: Revealed type is 'Any'
Вы уверены, что на самом деле вы используете mypy, а не просто код?Например, если вы запускаете только python3 test.py
, вы в основном пропускаете все проверки типов (за исключением некоторых проверок минимальной разумности, встроенных в модуль ввода).
Если вы хотите проверить код, введите pip-install mypy и запустите python3 -m mypy test.py
.
В любом случае все эти сообщения об ошибках ожидаемого поведения- mypy (и любая другая совместимая с PEP 484 программа проверки типов) может только анализировать ваш код статически и не будет пытаться запускать или анализировать какие-либо фабричные функции / любые функции генерации подсказок типа, которые вы можете попытаться написать.
Таким образом, это означает, что, к сожалению, вы не сможете использовать сгенерированную подсказку типа с ClassVars, если вы хотите, чтобы PEP 484-совместимые инструменты могли анализировать ваш код - они не могут понять / интерпретировать ваш оригиналнабор подсказок типов, и добавление ClassVars определенно не поможет.
Если вы хотите генерировать подсказки типов, единственная реальная возможность, о которой я могу подумать, - это создать какой-нибудь мини-язык или систему макросов поверхPython, который при запуске будет генерировать код Python.Затем вы запустили бы и проверили сгенерированный код вместо вашего макрофилированного языка Python.
Но я действительно не рекомендую делать это - это очень хрупкий взлом.
В более широком смыслевсякий раз, когда вы начинаете сталкиваться с подобными ограничениями, связанными с типами, я думаю, это признак того, что ваш код слишком сложен.Я бы хотел либо упростить ваш код, либо (если это невозможно) переключиться на такой язык, как Haskell или Idris, который позволил бы вам использовать более выразительную (хотя и более сложную) систему типов.
Например, в этомВ этом случае вы пытаетесь обобщить тип Tuple - это заставляет меня сделать вывод, что ваша кодовая база содержит множество различных типов кортежей разных типов и типов.
Это кажется мне немного подозрительным - явместо этого мы будем рассматривать преобразование некоторых из этих кортежей в обычные классы или (если вам по-прежнему нужна функциональность, подобная кортежу) в namedtuple . Классы данных (которые являются новыми с Python 3.7 ) также могут быть удобны здесь.
Эти решения также помогут сделать ваш код немного более читабельным - вы можетеТеперь дайте конкретные имена и значения каждому отдельному типу кортежей.
В качестве альтернативы, если у вас есть только несколько разных типов кортежей, но вы используете эти кортежи повсюду, вы можете попробовать использовать псевдонимы типов , поэтому вам не придется многократно набирать один и тот же (длинный) тип снова и снова.Например, вместо:
def foo(x: Tuple[int, int, int, int]) -> None: ...
... вы можете сделать:
IpAddress = Tuple[int, int, int, int]
def foo(x: IpAddress) -> None: ...