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

问题描述 投票:0回答:1

我在 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")

上面的代码片段Mypy失败了

python mypy python-typing
1个回答
10
投票

您在问题中链接到的源代码显示

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']
© www.soinside.com 2019 - 2024. All rights reserved.