Python类型:如何声明一个变量,该变量要么是类路径对象(os.path),要么是路径(pathlib)



我知道模块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是通用的。可以是strpathlib.Path

PathLiketype是一个类型提示,用于表示一个对象,该对象可以用来表示文件路径或类文件对象。它通常用作泛型类型提示,以接受可被视为路径的不同类型。它通过接受不同类型的路径表示(字符串、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作为返回值(所以它不会混淆你)。