2024-05-14 20:42:41 发布
网友
我在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
您在问题中链接到的源代码显示os.PathLike是一个抽象基类,它有一个abstractmethod,__fspath__。由于__subclasshook__的实现,任何定义__fspath__的类都被视为os.PathLike的子类,即使PathLike不在类的方法解析顺序中
os.PathLike
abstractmethod
__fspath__
__subclasshook__
PathLike
但是str数据类型没有__fspath__方法。因此,它不符合PathLike接口,因此,如果需要类型为PathLike的参数,MyPy应该拒绝类型为str的参数是有意义的
str
如果函数可以接受str对象或PathLike对象,则应将参数注释为Union[str, PathLike[str]],much as typeshed does here类型
Union[str, PathLike[str]]
顺便说一句,我对你为什么说“os.PathLike似乎不是泛型的”有点困惑。该类定义了__class_getitem__,因此在运行时完全可以参数化。在Python中>;=3.9:
__class_getitem__
>>> 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']
您在问题中链接到的源代码显示
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:相关问题 更多 >
编程相关推荐