为文件或类似文件的对象键入提示?
Posted
技术标签:
【中文标题】为文件或类似文件的对象键入提示?【英文标题】:Type hint for a file or file-like object? 【发布时间】:2016-11-28 21:25:53 【问题描述】:是否有任何正确的类型提示可用于 Python 中的文件或类似文件的对象?例如,我将如何对这个函数的返回值进行类型提示?
def foo() -> ???:
return open('bar')
【问题讨论】:
【参考方案1】:对以文本模式或二进制模式打开的文件分别使用typing.TextIO
或typing.BinaryIO
类型。
来自the docs:
类
typing.IO
I/O 流类型的包装命名空间。
这定义了泛型类型
IO[AnyStr]
和别名TextIO
和BinaryIO
分别为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
表示文件而不指定类型
如果您知道类型,请使用TextIO
或BinaryIO
您目前无法指定它是为写入而打开的或其编码。
举个例子:
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,请问这是怎么回事啊?
如何键入提示 Python 函数返回从超类派生的任何类的实例?