小编you*_*mit的帖子

联合中 io.TextIOBase 的类型检查问题

在下面的代码中,我有一个可以接受字符串或某些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对此非常满意。

python mypy

3
推荐指数
1
解决办法
2217
查看次数

标签 统计

mypy ×1

python ×1