对于共享相同父路径的两个Path
对象,如何比较它们以断言它们实际上共享相同的父路径?
>>> list(Path(input).parents)
[PosixPath('/usr/src/app'), PosixPath('/usr/src'), PosixPath('/usr'), PosixPath('/')]
>>> list(Path(output).parents)
[PosixPath('/usr/src/app'), PosixPath('/usr/src'), PosixPath('/usr'), PosixPath('/')]
>>> Path(input).parents == Path(output).parents
False
# huh?
尽管以下作品很成功,但把它放在List
:上似乎很尴尬
>>> list(Path(input).parents) == list(Path(output).parents)
True
Path.parents
实际上返回了一个帮助对象,该对象允许对路径元素(类型为pathlib._PathParents
)进行索引访问和高效迭代。因此,您的比较失败了,因为它试图比较这两个辅助对象,而不是它们的内容。
从这个意义上说,这些文件有点误导:
Path.parents:一个不可变序列,提供对路径的逻辑祖先的访问
。。。要真正回答这个问题,你可以选择:
正如评论中所指出的,你可以简单地比较父母:
Path(input).parent == Path(output).parent
这在许多情况下都有效,但如果路径的形式不相同(即..
出现在路径中或存在符号链接时),则将不匹配。
Path(...).samefile(...)
方法提供了一种很好的方法来避免这些问题,但请注意,由于parent
的计算忽略了..
,使用Path(...).parent.samefile(...)
仍然可能是一个问题。
使用Path(...).resolve().parent.samefile(...)
是我发现的避免所有这些问题的最全面的方法。
对于这个特定的问题,它看起来像:
Path(input).resolve().parent.samefile(Path(output).resolve().parent)