我原以为
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 库和内核。
稍微跑题了:我想要一个布尔值为False的Path。似乎不可能。我在 argparse 中使用 type=Path 执行此操作。我怀疑 OP 想要类似的东西。
我最终使用了两个选项之一,既不像我可以简单地测试“if the_possibly_false_Path:...”那样“优雅”