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 следует использовать в очень особых случаях; документация гласит:

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

Так что вы должны серьезно поставить под сомнение свой дизайн здесь! дайте нам немного больше информации о том, чего вы пытаетесь достичь. Возможно, есть лучшие и более чистые проекты, чем то, что вы пытаетесь сделать.

Другие вопросы по тегам