os.PathLike[Any]与os.PathLike[str]

2024-05-14 20:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在typeshed见过这样的行:

https://github.com/python/typeshed/blob/994b69ef8f18e76689daca3947879c3d7f76173e/stdlib/_typeshed/__init__.pyi#L77

但是os.PathLike似乎不是通用的。它不允许传递字符串

import os
import pathlib

def test(f: os.PathLike[str]):
    print(pathlib.Path(f))


test(r"C:\Program Files")

上面的代码片段fails Mypy


Tags: 字符串httpstestimportgithubcominitos
1条回答
网友
1楼 · 发布于 2024-05-14 20:42:41

您在问题中链接到的源代码显示os.PathLike是一个抽象基类,它有一个abstractmethod__fspath__。由于__subclasshook__的实现,任何定义__fspath__的类都被视为os.PathLike的子类,即使PathLike不在类的方法解析顺序中

但是str数据类型没有__fspath__方法。因此,它不符合PathLike接口,因此,如果需要类型为PathLike的参数,MyPy应该拒绝类型为str的参数是有意义的

如果函数可以接受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']

相关问题 更多 >

    热门问题