2

例如,我有一段代码如下:

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"

根据我对boundin的理解TypeVar,只要 aT是 的子类SuperClass,应该没问题。但是为什么 mypy 在这里抛出错误呢?谢谢!

4

1 回答 1

1

您的代码有两个问题:首先,您的cast_to函数的签名应该是:

def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:

然后,在您的陈述cast中,我不确定mypy是否允许您将. 相反,您可以尝试:cast_tocast

def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
    return cast(T, obj)

当然,使用此定义,您将无法cast_to仅使用一个参数进行调用。


我现在要问:为什么你觉得你需要这样做?你确定你的设计是好的吗?cast应该在非常特殊的情况下使用;该文件指出:

强制转换用于消除虚假的类型检查器警告,并在类型检查器无法完全理解发生了什么时为它提供一点帮助。

所以你应该在这里认真质疑你的设计!给我们更多关于你想要达到的目标的信息。也许有比你想做的更好、更干净的设计。

于 2019-01-29T17:06:04.560 回答