【发布时间】:2020-07-14 22:26:06
【问题描述】:
在下面的代码中,我有一个函数可以接受一个字符串或一些TextIOBase。如果传递了字符串,则将其解释为应打开和读取的文件的路径。如果传递了TextIOBase,则将读取该流的内容:
from typing import Union
import io
def function(foo: Union[str, io.TextIOBase]) -> None:
if isinstance(foo, str):
foo = open(foo, "w")
这看起来应该没问题,因为联合应该是协变的,这意味着联合中一种类型的子类应该满足类型注释,在这种情况下,open() 的输出类型是TextIOBase 的子类。然而,mypy 抱怨:
union.py:6: error: Incompatible types in assignment (expression has type "TextIO", variable has type "Union[str, TextIOBase]")
Found 1 error in 1 file (checked 1 source file)
根据传递的参数,我认为open() 的返回类型可能存在歧义,因此我尝试改为创建StringIO,但得到了同样的错误。有什么想法吗?为什么mypy生我的气?
我也尝试过一些玩具类(例如Union[str, T1],然后分配T2,其中T2 是 T1 的子类),mypy 对此非常满意。
【问题讨论】: