os.PathLike[Any]与os.PathLike[str]的区别

6

1
你应该从typeshed真正转录相关的代码片段(除了包含链接之外)。Python是开源的,所以没有问题,这样做可以使问题更自包含,也更适合读者。 - bad_coder
1个回答

7
您在问题中链接的源代码显示os.PathLike是一个抽象基类,具有单个abstractmethod__fspath__。由于__subclasshook__的实现,任何定义了__fspath__的类都被视为os.PathLike的子类,即使PathLike不在类的方法分辨率顺序中也是如此。
然而,str数据类型没有__fspath__方法。因此,它不符合PathLike接口,因此如果预期参数的类型为PathLike,则使用str类型的参数MyPy应该拒绝。
如果您的函数可以接受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']

1
好的,谢谢。我想知道[str]或[bytes]的意义是什么。这是__fspath__的返回类型 - 所以我认为str应该会被mypy自动允许,因为PathLike[str]表示“一个具有返回str的命名函数的类”,所以我假设传递一个str将被视为可接受的。 - Greedo
@Greedo 是的,如果你想了解 [str][bytes] 等的意义,我会始终查看 typeshed stubs 而不是 cpython 源代码。运行时源代码没有任何类型提示;如果你想找出一个类为什么可以参数化,以及这在类型提示方面意味着什么,我会始终去查看 typeshed stubs :) - Alex Waygood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接