Mypy 似乎忽略了 TypeVar 类型的界限
Mypy seems to ignore bound of a TypeVar type
比如我有一段代码如下:
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"
根据我对TypeVar
中bound
的理解,只要T
是SuperClass
的子类就可以了。但是为什么 mypy 在这里抛出错误?谢谢!
你的代码有两个问题:首先你的 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
应该在非常特殊的情况下使用;文件指出:
Casts are used to silence spurious type checker warnings and give the type checker a little help when it can’t quite understand what is going on.
所以你应该在这里认真质疑你的设计!向我们提供更多有关您要实现的目标的信息。也许有比您尝试做的更好、更简洁的设计。
比如我有一段代码如下:
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"
根据我对TypeVar
中bound
的理解,只要T
是SuperClass
的子类就可以了。但是为什么 mypy 在这里抛出错误?谢谢!
你的代码有两个问题:首先你的 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
应该在非常特殊的情况下使用;文件指出:
Casts are used to silence spurious type checker warnings and give the type checker a little help when it can’t quite understand what is going on.
所以你应该在这里认真质疑你的设计!向我们提供更多有关您要实现的目标的信息。也许有比您尝试做的更好、更简洁的设计。