如何在函数中键入提示文件名?

576*_*76i 22 python type-hinting python-3.x

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

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

def myfunc(filename: str) -> None:
    with open(filename) as f1:
        # do something here
Run Code Online (Sandbox Code Playgroud)

lxo*_*xop 25

我认为您正在寻找的是结构类型,目前尚不支持。它在PEP 544 中提出。

同时,您可以通过使用Union[str, bytes, os.PathLike].

  • 鉴于 Python 3.8 中对 PEP 544 的支持,文件名使用的正确提示是什么? (12认同)
  • 最近发布的 Python 3.8 支持 @576i PEP 544。 (2认同)

Rem*_*r00 15

正如埃里克所说,

PEP 519建议使用typing.Union[str, bytes, os.PathLike].

这是最简单的选择。

但您还应该考虑_typeshed.AnyPath:它根据不同版本支持各种路径,并且它是内置文件名库中的默认键入提示,例如函数open()本身。导入它会导致您的类型帮助程序识别出输入应该是文件名,并且可能有助于类型提示路径。它还具有_typeshed.StrPath仅适用于字符串和_typeshed.BytesPath仅适用于字节串的变体。这里给出他们的定义

但是,您不能只导入该typeshed模块,因为它在运行时不存在。最简单的解决方案是仅在类型检查期间导入它(因为这是您唯一需要它的时间):

from typing import TYPE_CHECKING
AnyPath = None
if TYPE_CHECKING:
    from _typeshed import AnyPath
Run Code Online (Sandbox Code Playgroud)

最后,在当前的 3.10 beta 版本中,AnyPath 已重命名为 StrOrBytesPath,以便将字符串和字节串与 Path 模块的路径分开,并且很快不会看到另一个 AnyPath。因此,如果您打算仅输入 str 文件名,则可以使用_typeshed.StrPath,或者直接放弃并使用typing.Union[str, bytes, os.PathLike]


Eri*_*ois 10

PEP 519建议使用typing.Union[str, bytes, os.PathLike]

  • 我用这个: `PathLike = TypeVar("PathLike", str, pathlib.Path, None)` (3认同)

小智 5

从 PEP 604 ( https://peps.python.org/pep-0604/ ) 和 python 3.10 开始, | 运算符现在可用于类型提示的联合。

所以 OP 示例现在可能如下所示:

def myfunc(filename: str | os.PathLike) -> None:
    with open(filename) as f1:
Run Code Online (Sandbox Code Playgroud)