为文件或类似文件的对象键入提示?

Posted

技术标签:

【中文标题】为文件或类似文件的对象键入提示?【英文标题】:Type hint for a file or file-like object? 【发布时间】:2016-11-28 21:25:53 【问题描述】:

是否有任何正确的类型提示可用于 Python 中的文件或类似文件的对象?例如,我将如何对这个函数的返回值进行类型提示?

def foo() -> ???:
    return open('bar')

【问题讨论】:

【参考方案1】:

对以文本模式或二进制模式打开的文件分别使用typing.TextIOtyping.BinaryIO 类型。

来自the docs:

typing.IO

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

这定义了泛型类型IO[AnyStr] 和别名TextIOBinaryIO 分别为IO[str]IO[bytes]。这些代表 I/O 流的类型,例如由open() 返回。

【讨论】:

一般情况下,也许 type.IO 作为类型描述? 这些似乎都不适合我:def f() -> IO: return open('test') 在 PyCharm 中给出了“预期类型 'IO',得到了 'TextIOWrapper[str]'”。 转载@Marein 在 PyCharm 社区 2017.2 中的问题:i.imgur.com/Ai4sVQl.jpg 文档有点混乱,它表示弃用,但我不完全确定它所涵盖的内容,乐观的解释是它只是关于 typing.io 命名空间,但我编程时不要过于乐观。 @Tshirtman 我认为您可以对此持乐观态度。我发现了this 关于弃用的问题,并且似乎更清楚typing.io 是要弃用的命名空间,因为typing.io.BinaryIO 和其他名称也存在并且大多直接从typing 命名空间使用,例如typing.BinaryIO .【参考方案2】:

简短的回答:

您需要明确。那是from typing import TextIO 而不仅仅是from typing import *。 使用IO 表示文件而不指定类型 如果您知道类型,请使用TextIOBinaryIO 您目前无法指定它是为写入而打开的或其编码。

举个例子:

from typing import BinaryIO

def binf(inf: BinaryIO):
    pass

with open('x') as f:
    binf(f)

给出Expected type 'BinaryIO', got 'TextIO' instead 的检查错误(在 PyCharm 中)

【讨论】:

以上是关于为文件或类似文件的对象键入提示?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 安装后在命令提示符中输入net语句出现 请键入NET HELPMSG 2185,请问这是怎么回事啊?

为需要 kwargs 的 Callable 键入提示

如何键入提示 Python 函数返回从超类派生的任何类的实例?

如图写了批处理文件,可是点击运行的时候,提示:请键入NET HELPMSG 2185以获得更多帮助

PHP:使用 Eclipse PDT 为字段键入提示

Linux常用快捷键