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

oalqel3c  于 2023-03-31  发布在  Python
关注(0)|答案(3)|浏览(146)

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

from pathlib import Path

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

我假设将Path('')定义为与Path('.')相同会获得优势,在什么情况下会有优势?

vecaoik1

vecaoik11#

就像其他人说的,它解析到当前路径,因此存在,但原因如下,
Path实际上是pathlib.PurePath的一个子类,当pathsegments(参数)为空时,pathlib.Path假定为当前目录(等价于'')。
你可以通过这样的经验证明

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

我假设通过将Path('')定义为与Path('.')相同可以获得优势。
正确。尽管我不是那个库的创建者,但我认为这是出于语法和逻辑原因。事实上,人们经常希望引用当前目录来动态计算某些内容。因此,出于.指向当前目录的相同原因,库的创建者可能希望让您编写这样的内容:

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

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

xmjla07d

xmjla07d2#

如果你尝试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)

所以你可以统计"",因为它是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库和内核的所有假设。

o3imoua4

o3imoua43#

稍微偏离主题:我想有一个Path的布尔值为False。似乎是不可能的。我在argparse中用type= Path做了这件事。我怀疑OP想要类似的东西。
最后我使用了两个选项中的一个,如果我可以简单地测试“if the_possibly_false_Path:...”,那么这两个选项都不像它那样“优雅”。
1.将默认值(我希望测试为False)设置为类似'%%'的值,这会导致argparse创建一个名为“%%”的Path,然后我可以测试它
1.将结果保留为默认类型,将默认值设置为测试False的值,然后在该值不为False时调用Path构造函数。

相关问题