Mypy, похоже, игнорирует границы типа TypeVar - PullRequest
0 голосов
/ 29 января 2019

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

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 Ответ

0 голосов
/ 29 января 2019

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

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

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

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