我有一个函数
safe_cast
,它将一个值转换为给定类型,但如果该值在运行时不符合该类型,则会引发:
from typing import TypeVar
T = TypeVar('T')
def safe_cast(t: type[T], value: Any) -> T:
if isinstance(value, t):
return cast(T, value)
raise TypeError()
这适用于原始类型。但是如果我想
safe_cast
反对 UnionType,我会遇到问题:
string = "string"
casted: str | int = safe_cast(str | int, string)
实例检查适用于联合类型。但是我的解决方案不起作用,因为 mypy 给了我
error: Argument 1 to "safe_cast" has incompatible type "UnionType"; expected "Type[<nothing>]" [arg-type]
我认为
<nothing>
在这里指的是未指定的类型变量T
。我还认为 mypy 显然无法将 Union[str, int]
解析为 Type[T]
。我的问题是:我该如何解决这个问题?
我研究了为 UnionType 创建一个重载。 IIUC,为了编写重载,我需要创建一个具有可变数量参数的通用联合类型。我没能完成这件事。
这个方向对吗?如果是,我该如何完成?如果不是,我如何使用
safe_cast
ing 联合类型解决我的问题?