Python 3.8及以上版本如何对类文件对象进行类型标注?
现代Python类文件对象类型标注方案
针对typing.IO、typing.TextIO、typing.BinaryIO弃用后的标注问题,目前社区有几种成熟的通用方案,可根据自身场景选择:
优先选择:使用
io模块的抽象基类
如果你的标注仅需要匹配标准库open()返回的原生文件对象,直接替换为io模块对应基类即可,无需额外依赖,兼容性最好:- 替换原
typing.TextIO:使用io.TextIOBase,对应文本模式打开的文件对象 - 替换原
typing.BinaryIO:使用io.BufferedIOBase,对应二进制模式打开的缓冲文件对象 - 替换原
typing.IO:使用io.IOBase,对应所有通用类文件对象的父类
示例代码:
import io def write_content(f: io.TextIOBase, content: str) -> None: f.write(content)- 替换原
兼容鸭子类型类文件对象:自定义Protocol
如果你需要适配没有继承IOBase的自定义类文件对象(比如内存中的类文件流、第三方库封装的文件对象),可以通过Protocol自定义所需的方法签名,完全匹配鸭子类型的校验规则:
示例(定义可读取的文本类文件对象):from typing import Protocol class TextReadable(Protocol): def read(self, n: int = -1) -> str: ... def close(self) -> None: ... def read_content(f: TextReadable) -> str: return f.read()
注意:如果你的项目需要兼容Python 3.12以下版本,不要直接从
typing模块导入已弃用的IO类型,避免后续版本升级时报错。
内容的提问来源于stack exchange,提问作者Migwell
相关产品推荐
相关产品推荐

