如何在Python 3.6中将__fspath__转换为接受pathlib.PurePath对象
如[https://stackoverflow.com/a/40319071/895245]所述,Python 3.6中的shutdown可以容纳__fspath__个对象。
由于这感觉很神奇,因此我决定研究一下它是如何实现的,以查看是否可以在自己的类中重用此魔术。
改进是PEP 519的结果:[https://www.python.org/dev/peps/pep-0519/]
这概括了很多stdlib功能,结果并没有持续更新文档,包括__fspath__中的大多数,从3.7开始,仅单个功能支持文档。 欢迎来到动态打字的乐趣。
在有文档记录的地方,stlib链接到“类路径对象”的词汇表:[https://docs.python.org/3/glossary.html#term-path-like-object]
表示文件系统路径的对象。 类路径对象可以是表示路径的str或bytes对象,也可以是实现os.PathLike协议的对象。 支持os.PathLike协议的对象可以通过调用os.fspath()函数转换为str或bytes文件系统路径。 可以分别使用os.fsdecode()和os.fsencode()来保证str或bytes结果。 由PEP 519引入。
然后链接到__fspath__的文档:[https://docs.python.org/3/glossary.html#term-path-like-object]
代表文件系统路径的对象的抽象基类,例如 pathlib.PurePath。
3.6版的新功能。
__fspath__
返回对象的文件系统路径表示形式。
该方法应仅返回str或bytes对象,首选项为str。
关键实现的提交似乎是:
3f9183b5aca568867f37c38501fca63911580c66,基本上会更改最低级别的路径操作点为__fspath__
568be63248614a2cdd7666a67ddfd16e817f7db9,将__fspath__添加到pathlib.PurePath
如果要实现自己的类路径类,则可以执行以下操作:
#!/usr/bin/env python3
class MyPath:
def __init__(self, path):
self.path = path
def __fspath__(self):
return self.path
with open(MyPath('f'), 'w'):
pass
已在Ubuntu 3.10,Python 3.6.7中测试。