如何解决正确输入sys.stdout和文件
我正在尝试创建一种方法,该方法可以处理代表文件名,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"
AFAIK,TextIO是用于文本文件的正确类型,但是无法对此类型进行isinstance
检查。代码结构确保了在发生错误时,我们不能拥有TestIO
对象,因为它是在上一个分支中处理过的。
如何在这里标记所有类型?
解决方法
由于Mypy理解open
检查并在一个位置调用isinstance
,因此可以重写以下代码以在Path分支中隔离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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。