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

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

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

【问题讨论】:

    标签: python type-hinting


    【解决方案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 中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2021-02-15
      • 2018-07-06
      • 2012-04-19
      • 2023-03-29
      相关资源
      最近更新 更多