繁体   English   中英

为什么 python pathlib Path('').exists() 返回 True?

[英]Why does the python pathlib Path('').exists() return True?

我期望Path('')是一个不存在的路径,因为它不对应于文件或目录名称。 为什么这被认为存在?

from pathlib import Path

print(Path('').exists())

我认为通过将Path('')定义为与Path('.')相同可以获得优势。 在什么情况下有优势?

正如其他人所说,它解析为当前路径,因此存在,但这就是为什么,

pathlib.Path 实际上pathlib.PurePath的一个子类,它在pathsegments (参数)为空(相当于'' )时假定当前目录。

你可以像这样凭经验证明,

from pathlib import PurePath
print(PurePath())
>>>> .

我认为通过将 Path('') 定义为与 Path('.') 相同可以获得优势。

正确的。 尽管我不是该库的创建者,但我认为这是出于语法和逻辑原因。 事实上,人们经常希望引用当前目录来动态计算某些东西。 因此,出于同样的原因. 指向当前目录,lib 创建者可能想让你写这样的东西,

>>>> p = Path() # or possibly Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]

这将列出子目录。

基本上,将此视为默认值 逻辑上Path()返回的默认路径是当前目录。 因此,从逻辑上讲,空字符串值应该具有相同的行为。

如果你尝试stat你得到:

$ touch ""
touch: cannot touch '': No such file or directory

但如果你往里看,情况就不同了:

$ strace -e file touch ""
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=122530, ...}, AT_EMPTY_PATH) = 0
openat(AT_FDCWD, "", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = -1 ENOENT (No such file or directory)

所以你可以 stat ""因为它是 CWD,但你不能将它作为文件打开,因为不存在这样的文件。 的确:

$ strace -e file ipython3 
In [1]: import pathlib

In [2]: p = pathlib.Path()

In [3]: p.exists()
newfstatat(AT_FDCWD, ".", {st_mode=S_IFDIR|0755, st_size=20480, ...}, 0) = 0
Out[3]: True

因此,这不完全是 Python 的pathlib模块的任何假设,而是从 C lib 和内核开始。

稍微偏离主题:我想要一个布尔值为 False 的路径。 似乎是不可能的。 我在 argparse 中使用 type=Path 执行此操作。 我怀疑OP想要类似的东西。

我最终使用了两个选项之一,都不像我可以简单地测试“if the_possibly_false_Path:...”那样“优雅”。

  1. 将默认值(我希望测试为 False)设置为“%%”之类的内容,这会导致 argparse 创建一个名为“%%”的路径,然后我可以对其进行测试
  2. 将结果保留为默认类型,将默认值设置为测试 False 的值,然后在值不为 false 时调用 Path 构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM