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

时间:2018-11-21 17:59:56

标签: python-3.x type-hinting

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

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

同时,您可以通过用Union[str, bytes, PathLike]进行注释来做一些半途而废的工作。

答案 2 :(得分:1)

正如埃里克所说,

<块引用>

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

这是最简单的选择。

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

但是,您不能仅将 typeshed 模块导入为 Here for their definition。最简单的解决方案是仅在类型检查期间导入它(因为这是您唯一需要它的时候):

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

最后,在当前的 3.10 beta 版本中,AnyPath it doesn't exist at runtime StrOrBytesPath,为了将字符串和字节串与 Path 模块的路径分开,另一个 AnyPath 不会被很快就看到了。因此,如果您打算只输入 str 文件名,则可以使用 _typeshed.StrPath,或者放弃并使用 typing.Union[str, bytes, os.PathLike]