我知道模块pathlib自Python 3.4以来是新的,我试图尽可能多地使用它,但我有很多现有的代码:"import os.path"。几个星期以来,我也在尝试在代码中添加打字功能,但我仍在学习如何做到这一点。我还不明白如何声明一个有歧义类型的变量——使一个变量要么是一个所谓的类路径对象(os.path),要么是一个路径(pathlib)。这样的变量可以用作输入,例如打开语句。我在一个名为test_typevar:
的测试模块中尝试了这一点from pathlib import Path
from typing import TypeVar
from some_module import some_function
PathLike = TypeVar("PathLike", str, Path)
fpath: PathLike
line: str
# Now suppose fpath is returned by some code and it's either a Path or a path-like object:
fpath = some_function()
with open(fpath, "rt") as f:
line = f.readline()
...
这是我得到的错误语句:
错误:类型变量"test_typevar.PathLike"未绑定
注意:(提示:使用"Generic[PathLike]"或"协议[PathLike]";绑定"PathLike">
注意:(提示:使用"PathLike"在函数签名中绑定PathLike"函数内部)
有人能进一步解释吗?
我认为os.PathLike
是通用的。可以是str
或pathlib.Path
。
PathLike
type是一个类型提示,用于表示一个对象,该对象可以用来表示文件路径或类文件对象。它通常用作泛型类型提示,以接受可被视为路径的不同类型。它通过接受不同类型的路径表示(字符串、pathlib.Path
或行为类似路径的自定义对象)来实现灵活性。
from os' documentation:
类操作系统。PathLike表示文件系统路径的对象的抽象基类,例如pathlib.PurePath.
from os源代码:
实现文件系统路径协议的抽象基类。
你可以直接使用:
import pathlib
a = pathlib.PurePath("somepath")
a
returns: PureWindowsPath('somepath')
b = pathlib.Path("somepath")
b
returns: WindowsPath('somepath')
c = pathlib.PurePosixPath("somepath")
c
returns: PurePosixPath('somepath')
您也可以在用逗号分隔的括号中组合路径。如pathlib.Path(some path, next directory, finaly directory)
,它会将路径连接成一条。
知道:PurePath适用于windows, PurePosixPath适用于UNIX, Path适用于两者,您可以简单地使用Path或检测您在哪个操作系统上,然后使用适当的PathType。
将接受\sss\sss\
路径WINDOWS语法和/sss/sss/
路径UNIX语法。
编辑:Path(..)应该自动检测操作系统类型,所以这就是为什么你可以看到WindowsPath作为返回值(所以它不会混淆你)。