python - 正确输入 sys.stdout 和文件

标签 python python-3.x python-typing

我正在尝试创建一个方法来处理表示文件名的字符串、Path 对象或已打开的输出流(sys.stdout打开('...','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 对象,因为它已在上一个分支中处理过。

我应该如何标记这里的所有类型?

最佳答案

这段代码可以重写如下,以隔离 Path 分支中的 open,因为 Mypy 理解 isinstance 检查,并在一个中调用 write地点:

import io
from pathlib import Path
from typing import Union, TextIO, Text
from contextlib import ExitStack


def generate(output: Union[Text, Path, TextIO]) -> None:
    with ExitStack() as stack:
        if isinstance(output, Text):
            output = Path(output)
        if isinstance(output, Path):
            output = stack.enter_context(output.open("w"))
        output.write("data")

关于python - 正确输入 sys.stdout 和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63703237/

相关文章:

python - ZeroDivisionError : float division by zero, 如何在用户首次输入特定字符串时打印某些内容然后退出?

python-3.x - Python不准确的曲线拟合

python - 如何在python中调用带有这么多参数的SQL Server存储过程?

python - 我如何告诉 PyCharm 参数应该是什么类型?

python - 如何使用 python mypy 在 lambda 中输入正则表达式

python - 如何在 csv_file 中显示一个单词一个单元格而不是一个字符一个单元格的数据?

python - 如何加快从 python 重复调用 ruby​​ 程序(github 的语言学家)的速度?

python - 如何使用客户端 ID 和 key 将 OAuth 实现到 FastAPI

python - 获取与静态类型检查器一起使用的 TypedDict 值类型的函数

python - 这个python代码线程安全吗(扭曲的线程)?