我正在尝试创建一个方法,它可以处理表示文件名的字符串、Path
对象或已经打开的输出流(sys.stdout
, open('...', 'w')
)。我正在努力为mypy
设置正确的类型以进行检查。
到目前为止,我已经得到了:
import io
from pathlib import Path
from typing import Union, TextIO, Text
def generate(output: Union[Text, Path, TextIO]) -> None:
if isinstance(output, io.IOBase):
output.write("data")
else:
if isinstance(output, Text):
output = Path(output)
with output.open("w") as output_file:
output_file.write("data")
但是mypy
一直在抱怨:
Item "TextIO" of "Union[Path, TextIO]" has no attribute "open"
据我所知,TextIO是用于文本文件的正确类型,但是无法对这种类型进行isinstance检查。 代码结构确保在出现错误时,我们不可能拥有TestIO对象,因为它已经在之前的分支中被处理过了。
这里应该如何标记所有类型?