Python 如何将'Union[bytes,str]`类型的值传递给接受'AnyStr'的函数`

Python 如何将'Union[bytes,str]`类型的值传递给接受'AnyStr'的函数`,python,types,type-theory,Python,Types,Type Theory,假设我有两个函数: 从输入import Union,AnyStr def(x:Union[bytes,str]): 返回g(x) def g(x:AnyStr): 返回x 在此服务器上运行mypy会导致错误 :3: error: Value of type variable "AnyStr" of "g" cannot be "Union[bytes, str]" 可通过执行以下操作解决此问题: 从输入import Union,An

假设我有两个函数:

从输入import Union,AnyStr
def(x:Union[bytes,str]):
返回g(x)
def g(x:AnyStr):
返回x
在此服务器上运行
mypy
会导致错误

:3: error: Value of type variable "AnyStr" of "g" cannot be "Union[bytes, str]"
可通过执行以下操作解决此问题:

从输入import Union,AnyStr
def(x:Union[bytes,str]):
如果isinstance(x,字节):
g(x)
elif isinstance(x,str):
g(x)
def g(x:AnyStr):
返回x
当然,可以将
bytes
str
类型(一个
Union[bytes,str]
必须是bytes或
str
,而不是两者都是)传递给接受
AnyStr
的函数


为什么不是这样?

这显然是一个开放的bug。严格地说,我想它们是不等价的。例如,对于
x:Union[bytes,str]
,则
x='hello';x=b'world'
可以工作,但是对于
AnyStr
,它是可以工作的,但是在这个特殊的情况下,在我调用
f(x)
的时候,我认为
x
必须是
str
或者
bytes
,不能两者都是。对,我的观点是,你不能只做一个简单的替换,但是是的,类型检查器应该能够清楚地看到此案例的工作情况。也许下一个版本他们会添加增强功能,如果
键入.cast()
有效,您能试试吗?尝试将其强制转换为
AnyStr