Un.io中的io.TextIOBase类型检查问题

问题描述 投票:1回答:1

在下面的代码中,我有一个可以接受字符串或某些TextIOBase的函数。如果传递了字符串,则将其解释为应打开并读取的文件的路径。如果传递了TextIOBase,则将读取该流的内容:

    from typing import Union
    import io

    def function(foo: Union[str, io.TextIOBase]) -> None:
        if isinstance(foo, str):
            foo = open(foo, "w")

    return

这似乎应该没问题,因为联合被认为是协变的,这意味着联合中类型之一的子类应满足类型注释,在这种情况下,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非常满意。

python mypy
1个回答
0
投票

typing模块具有专用的对象:typing.TextIOtyping.TextIO的返回类型是根据open参数确定的,并计算为以下类型之一:modeTextIO

© www.soinside.com 2019 - 2024. All rights reserved.