【问题标题】:How do I type hint a filename in a function?如何在函数中键入提示文件名?
【发布时间】:2019-04-24 09:00:42
【问题描述】:

在 Python 中提示文件名的最佳方法是什么, 这样可以将任何内容传递给可以作为文件打开的函数吗?

尤其是通过 Pathlib 找到的字符串和文件。

def myfunc(filename: str) -> None:
    with open(filename) as f1:
        # do something here

【问题讨论】:

    标签: python python-3.x type-hinting python-typing


    【解决方案1】:

    我认为您正在寻找的是尚不支持的结构类型。建议在PEP 544

    同时,您可以通过使用Union[str, bytes, os.PathLike] 进行注释来完成一半的工作。

    【讨论】:

    • @576i PEP 544 在最近发布的 Python 3.8 中得到支持。
    • 鉴于 Python 3.8 中 PEP 544 的支持,文件名使用的正确提示是什么?
    • 我刚刚再次浏览了 PEP544 并稍微查看了 Python3.8 提供的库,但我看不到任何立即有用的东西。因此,虽然结构类型似乎是它应该完成的方式,但似乎还没有任何官方使用它。
    • open() 还允许文件描述符编号(int 类型)作为其第一个参数。考虑到很大的歧义,在界面中声明它是否是一个好主意是值得商榷的。
    【解决方案2】:

    PEP 519 推荐使用typing.Union[str, bytes, os.PathLike]

    【讨论】:

    • 我将此作为单独的答案添加,因为 lxop 的答案主要建议使用结构类型。
    • 我用这个:PathLike = TypeVar("PathLike", str, pathlib.Path, None)
    【解决方案3】:

    正如埃里克所说,

    PEP 519 推荐使用typing.Union[str, bytes, os.PathLike]

    这是最简单的选择。

    但你也应该考虑_typeshed.AnyPath:它支持根据不同版本的各种路径,它是文件名内置库中的默认输入提示,例如the function open() itself。 导入它会导致您的类型助手识别输入应该是文件名,并且可能有助于键入提示路径。它还具有仅用于字符串的_typeshed.StrPath 和仅用于字节字符串的_typeshed.BytesPath 的变体。 Here for their definition.

    但是,您不能只将 typeshed 模块导入为 it doesn't exist at runtime。最简单的解决方案是仅在类型检查期间导入它(因为这是您唯一需要它的时候):

    from typing import TYPE_CHECKING
    AnyPath = None
    if TYPE_CHECKING:
        from _typeshed import AnyPath
    

    最后,在当前的 3.10 beta 版本中,AnyPathhas been renamed toStrOrBytesPath,以便将字符串和字节字符串与 Path 模块的路径分开,并且很快不会看到另一个 AnyPath。所以,如果你打算只输入str文件名,你可以使用_typeshed.StrPath,或者干脆放弃使用typing.Union[str, bytes, os.PathLike]

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2022-08-05
      • 2013-04-30
      • 1970-01-01
      • 2023-03-31
      • 2021-01-11
      • 2016-01-23
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多