在下面的代码中,我有一个可以接受字符串或某些TextIOBase. 如果传递一个字符串,它将被解释为应该打开和读取的文件的路径。如果TextIOBase传递 a,则将读取该流的内容:
from typing import Union
import io
def function(foo: Union[str, io.TextIOBase]) -> None:
if isinstance(foo, str):
foo = open(foo, "w")
Run Code Online (Sandbox Code Playgroud)
这看起来应该没问题,因为 Union 应该是协变的,这意味着 union 中类型之一的子类应该满足类型注释,在这种情况下, 的输出类型是 的子open()类TextIOBase。然而,mypy 抱怨:
from typing import Union
import io
def function(foo: Union[str, io.TextIOBase]) -> None:
if isinstance(foo, str):
foo = open(foo, "w")
Run Code Online (Sandbox Code Playgroud)
open()我认为根据传递的参数,返回类型的歧义可能存在问题,因此我尝试改为使用 a StringIO,但得到了相同的错误。有什么想法吗?mypy 为什么对我生气?
我还尝试过使用一些玩具类(例如Union[str, T1],然后分配一个T2,其中T2是 T1 的子类),mypy对此非常满意。