我在typeshed中见过这样的代码行:
但是os.PathLike似乎不是通用的。它不允许传递字符串。
import os
import pathlib
def test(f: os.PathLike[str]):
print(pathlib.Path(f))
test(r"C:\Program Files")上面的代码片段fails Mypy。
发布于 2021-10-22 16:15:26
您在问题中链接到的源代码显示,os.PathLike是一个抽象基类,它只有一个abstractmethod,即__fspath__。由于__subclasshook__的实现,任何定义__fspath__的类都被视为os.PathLike的子类,即使PathLike不在该类的方法解析顺序中。
但是,str数据类型没有__fspath__方法。因此,它不符合PathLike接口,因此,如果需要类型为str的参数,则MyPy应该拒绝类型为PathLike的参数是有道理的。
如果您的函数既可以接受str对象,也可以接受PathLike对象,则应该将参数注释为Union[str, PathLike[str]],much as typeshed does here类型。
顺便说一句,我有点搞不懂你为什么说"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']https://stackoverflow.com/questions/69673650
复制相似问题