注释“a”的正确方法;“文件类型”;用Python

注释“a”的正确方法;“文件类型”;用Python,python,python-3.5,type-hinting,Python,Python 3.5,Type Hinting,在现代版本的Ppython中,可以使用函数注释进行静态类型分析。这通过打字模块变得容易 现在我想知道如何给“文件流”一个“类型提示” 我将插入什么作为文件类型 使用print(type(file))返回根本不清楚的 难道没有一种通用的“文件”类型吗?我想你想要的是,“所有I/O类的抽象基类,作用于字节流。” 请注意,这还包括内存中的流,如io.StringIO和io.BytesIO。有关详细信息,请阅读上的文档。您可以使用键入.IO、键入.TextIO和键入.binaryo来表示不同类型的I/O

在现代版本的Ppython中,可以使用函数注释进行静态类型分析。这通过打字模块变得容易

现在我想知道如何给“文件流”一个“类型提示”

我将插入什么作为
文件类型

使用
print(type(file))
返回根本不清楚的

难道没有一种通用的“文件”类型吗?

我想你想要的是,“所有I/O类的抽象基类,作用于字节流。”


请注意,这还包括内存中的流,如
io.StringIO
io.BytesIO
。有关详细信息,请阅读上的文档。

您可以使用
键入.IO
键入.TextIO
键入.binaryo
来表示不同类型的I/O流。引述:

课堂打字。io

I/O流类型的包装器命名空间

这定义了
分别是
IO[str]
IO[bytes]
。这些代表了 I/O流的类型,如
正如他所返回的那样

这些类型也可以直接访问,如
typing.IO
typing.TextIO

键入.binaryo

或者:

from typing import TextIO # or IO or BinaryIO

def myfunction(file: TextIO ):
    pass

from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from typing import TextIO # or IO or BinaryIO

def myfunction(file: 'TextIO'):
    pass

第二种方法将避免在执行期间导入类。尽管python在执行过程中仍然必须导入
类型检查
,但避免仅为类型暗示导入类是一种很好的做法:(1)不会执行(只是解析),并且(2)它可以避免循环导入

注释必须引用磁盘上的物理文件,还是也可以包含类似文件的对象,如
StringIO
?作为注释:这是我可能得到的“最佳”答案。这个问题还没有解决。很多事情都依赖于_io._base和它的导数。不过,
\u io.\u base
io.base
都没有“通用”顶层?@paul23我不明白你的意思。AFAIK
io.IOBase
是指向“bytestream”的最佳类型提示,可以使用标准库创建的每个类似文件的对象都是它的一个实例。如果
IOBase
不符合您对ByTestStream的想法,或者您有一个用例,其中它不是一个好的类型提示,您可能需要编辑您的问题并解释原因。例如,如果您使用BytesIO打开内存中的字节流;这源于
\u bufferedobase
,它源于
\u IOBase
@paul23这是一个什么问题?以防万一,您没有注意到,
io.BytesIO
也继承自
io.IOBase
。鉴于类型提示PEP的目标之一,我不明白为什么避免导入类型提示是一种好做法。
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from typing import TextIO # or IO or BinaryIO

def myfunction(file: 'TextIO'):
    pass