从文件中可以看出:
泛型类型
IO[AnyStr]及其子类TextIO(IO[str])和BinaryIO(IO[bytes])表示I/O流的类型,如open()返回的。 - Python:typing.IO
文档没有指定何时对对应方使用BinaryIO/TextIO,IO[str]和IO[bytes]。
通过对Python源代码的简单检查,只有30次点击在搜索BinaryIO时找到,109次点击找到IO[bytes]。
为了更好地与BinaryIO兼容,我试图从IO[bytes]切换到狮身人面像-autodoc-类型提示,但是切换打破了许多类型检查,因为像tempfile.NamedTemporaryFile这样的方法被键入为IO[bytes]而不是其他方法。
就设计而言,使用每种IO类型提示的正确情况是什么?
发布于 2020-01-13 08:29:04
BinaryIO和TextIO分别直接子类IO[bytes]和IO[str],并添加了一些额外的方法--详细信息见已键入的定义。
因此,如果需要这些额外的方法,请使用BinaryIO/TextIO。否则,最好使用IO[...]来获得最大的灵活性。例如,如果您将一个方法注释为接受一个IO[str],那么最终用户提供该对象的一个实例就会容易一些。
尽管如此,IO类目前还有点混乱:它们定义了许多并非所有函数实际上都需要的方法。因此,类型化的维护人员实际上正在考虑将IO类分解为较小的协议。如果你愿意的话,也许你也可以这么做。如果您想要定义自己的IO类,但不想承担实现完整的typing.IO[...] API的负担,这种方法非常有用,或者如果您使用的类类似于IO,但不完全是IO类。
尽管如此,这三种方法--使用BinaryIO/TextIO、IO[...]或定义更紧凑的自定义协议--都是完全有效的。如果斯芬克斯的扩展由于某种原因似乎无法处理一种特定的方法,那么这可能是它们的一个错误。
https://stackoverflow.com/questions/59693359
复制相似问题