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

mat*_*ttm 5 python python-3.x pathlib

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

from pathlib import Path

print(Path('').exists())
Run Code Online (Sandbox Code Playgroud)

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

sch*_*tte 5

就像其他人所说的,它解析到当前路径,因此存在,但这就是原因,

pathlib.Path是实际上可以的子类pathlib.PurePath其中假定当所述当前目录pathsegments(自变量)是空的(相当于'')。

您可以凭经验证明

from pathlib import PurePath
print(PurePath())
>>>> .
Run Code Online (Sandbox Code Playgroud)

我认为通过将Path('')定义为与Path('。')相同有一个好处。

正确。即使我不是该库的创建者,我仍认为这是出于语法和逻辑原因。确实,人们经常希望引用当前目录来动态地计算某些内容。因此,出于相同的原因,.指向当前目录,lib创建者可能想让您编写如下内容,

>>>> p = Path() # or possibly Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
Run Code Online (Sandbox Code Playgroud)

那会列出子目录。

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


Mar*_*one 5

如果你尝试stat你会得到:

$ touch ""
touch: cannot touch '': No such file or directory
Run Code Online (Sandbox Code Playgroud)

但如果你往里面看,故事就不同了:

$ 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)
Run Code Online (Sandbox Code Playgroud)

所以你可以统计,""因为它是 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
Run Code Online (Sandbox Code Playgroud)

因此,这并不完全是来自 Python 模块的任何假设pathlib,而是一直到 C 库和内核。