我在 typeshed 中见过这样的行:
但是 os.PathLike 似乎并不通用。它不允许传递字符串。
import os
import pathlib
def test(f: os.PathLike[str]):
print(pathlib.Path(f))
test(r"C:\Program Files")
上面的代码片段Mypy失败了。
您在问题中链接到的源代码显示
os.PathLike
是一个抽象基类,具有单个 abstractmethod
、__fspath__
。由于 __subclasshook__
的实现,任何定义 __fspath__
的类都被视为 os.PathLike
的子类,即使 PathLike
不在类的方法解析顺序中。
但是,
str
数据类型没有 __fspath__
方法。因此,它不符合 PathLike
接口,因此如果需要 str
类型的参数,MyPy 应该拒绝 PathLike
类型的参数是有道理的。
如果你的函数可以接受
str
对象或 PathLike
对象,你应该将参数注释为 Union[str, PathLike[str]]
类型,就像 typeshed 在这里所做的那样。
顺便说一句,我有点困惑为什么你说“
os.PathLike
似乎不通用”。该类定义了 __class_getitem__
,因此它在运行时完全可参数化。在 Python >= 3.9 中:
>>> from os import PathLike
>>> PathLike[str]
os.PathLike[str]
>>> PathLike[bytes]
os.PathLike[bytes]
>>> PathLike['idk, anything you like really']
os.PathLike['idk, anything you like really']