首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >os.PathLike[Any] vs os.PathLike[str]

os.PathLike[Any] vs os.PathLike[str]
EN

Stack Overflow用户
提问于 2021-10-22 08:23:44
回答 1查看 92关注 0票数 0

我在typeshed中见过这样的代码行:

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

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

代码语言:javascript
复制
import os
import pathlib

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


test(r"C:\Program Files")

上面的代码片段fails Mypy

EN

回答 1

Stack Overflow用户

发布于 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中:

代码语言:javascript
复制
>>> 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']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69673650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档