如何在函数中键入提示文件名?
How do I type hint a filename in a function?
Python 提示文件名的最佳方法是什么,
这样就可以将任何内容传递给可以作为文件打开的函数吗?
尤其是通过 Pathlib 找到的字符串和文件。
def myfunc(filename: str) -> None:
with open(filename) as f1:
# do something here
我认为您正在寻找的是结构类型,目前尚不支持。在PEP 544.
中提出
与此同时,您可以通过使用 Union[str, bytes, os.PathLike]
进行注释来完成一半的工作。
PEP 519 建议使用 typing.Union[str, bytes, os.PathLike]
正如 Eric 所说,
PEP 519 recommends using 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 版本中,AnyPath
has been renamed to StrOrBytesPath
,为了将字符串和字节串与 Path 模块的路径分开,以及另一个 AnyPath不会很快被看到。所以,如果你打算只输入 str 文件名,你可以使用 _typeshed.StrPath
,或者干脆放弃并使用 typing.Union[str, bytes, os.PathLike]
.
Python 提示文件名的最佳方法是什么, 这样就可以将任何内容传递给可以作为文件打开的函数吗?
尤其是通过 Pathlib 找到的字符串和文件。
def myfunc(filename: str) -> None:
with open(filename) as f1:
# do something here
我认为您正在寻找的是结构类型,目前尚不支持。在PEP 544.
中提出与此同时,您可以通过使用 Union[str, bytes, os.PathLike]
进行注释来完成一半的工作。
PEP 519 建议使用 typing.Union[str, bytes, os.PathLike]
正如 Eric 所说,
PEP 519 recommends using
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 版本中,AnyPath
has been renamed to StrOrBytesPath
,为了将字符串和字节串与 Path 模块的路径分开,以及另一个 AnyPath不会很快被看到。所以,如果你打算只输入 str 文件名,你可以使用 _typeshed.StrPath
,或者干脆放弃并使用 typing.Union[str, bytes, os.PathLike]
.