Mypy, похоже, игнорирует границы типа TypeVar
Например, у меня есть кусок кода, подобный следующему:
from typing import Type, TypeVar, cast
class SuperClass:
pass
T = TypeVar('T', bound=SuperClass)
def cast_to(obj: SuperClass, cast_to: Type[T] = SuperClass) -> T:
return cast(cast_to, obj)
И я сохранил это в type_check.py
, Если я запускаю на нем mypy, я получаю следующие сообщения об ошибках:
type_check.py:10: error: Incompatible default for argument "cast_to" (default has type "Type[SuperClass]", argument has type "Type[T]")
type_check.py:11: error: Invalid type "cast_to"
Из моего понимания bound
в TypeVar
До тех пор, пока T
это подкласс SuperClass
, должно быть хорошо. Но тогда почему mypy выдает ошибку здесь? Спасибо!
1 ответ
Есть две проблемы с вашим кодом: сначала подпись вашего cast_to
функция должна быть:
def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:
Тогда в вашем cast
Скажите, я не уверен mypy
позволит вам использовать cast_to
в качестве первого аргумента cast
, Вместо этого вы можете попробовать:
def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
return cast(T, obj)
Конечно, с этим определением вы не сможете позвонить cast_to
только с одним аргументом.
Теперь я собираюсь спросить: почему вы чувствуете, что должны это сделать? Вы уверены, что ваш дизайн хорош? cast
следует использовать в очень особых случаях; документация гласит:
Приведения используются для того, чтобы заставить замолчать ложные предупреждения проверки типов и оказать помощь в проверке типов, когда она не совсем понимает, что происходит.
Так что вы должны серьезно поставить под сомнение свой дизайн здесь! дайте нам немного больше информации о том, чего вы пытаетесь достичь. Возможно, есть лучшие и более чистые проекты, чем то, что вы пытаетесь сделать.