[英]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:...”那样“优雅”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.