我希望Path('')是一个不存在的路径,因为它不对应于文件或目录名。为什么这被认为是存在的?
Path('')
from pathlib import Path print(Path('').exists())
我假设将Path('')定义为与Path('.')相同会获得优势,在什么情况下会有优势?
Path('.')
vecaoik11#
就像其他人说的,它解析到当前路径,因此存在,但原因如下,Path实际上是pathlib.PurePath的一个子类,当pathsegments(参数)为空时,pathlib.Path假定为当前目录(等价于'')。你可以通过这样的经验证明
pathsegments
''
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()返回的默认路径是当前目录是逻辑。因此,逻辑上,空字符串值应该具有相同的行为。
Path()
xmjla07d2#
如果你尝试stat,你会得到:
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库和内核的所有假设。
pathlib
o3imoua43#
稍微偏离主题:我想有一个Path的布尔值为False。似乎是不可能的。我在argparse中用type= Path做了这件事。我怀疑OP想要类似的东西。最后我使用了两个选项中的一个,如果我可以简单地测试“if the_possibly_false_Path:...”,那么这两个选项都不像它那样“优雅”。1.将默认值(我希望测试为False)设置为类似'%%'的值,这会导致argparse创建一个名为“%%”的Path,然后我可以测试它1.将结果保留为默认类型,将默认值设置为测试False的值,然后在该值不为False时调用Path构造函数。
3条答案
按热度按时间vecaoik11#
就像其他人说的,它解析到当前路径,因此存在,但原因如下,
Path实际上是pathlib.PurePath的一个子类,当
pathsegments
(参数)为空时,pathlib.Path假定为当前目录(等价于''
)。你可以通过这样的经验证明
我假设通过将Path('')定义为与Path('.')相同可以获得优势。
正确。尽管我不是那个库的创建者,但我认为这是出于语法和逻辑原因。事实上,人们经常希望引用当前目录来动态计算某些内容。因此,出于
.
指向当前目录的相同原因,库的创建者可能希望让您编写这样的内容:列出子目录。
基本上,将其视为***default***。
Path()
返回的默认路径是当前目录是逻辑。因此,逻辑上,空字符串值应该具有相同的行为。xmjla07d2#
如果你尝试
stat
,你会得到:但如果你往里面看,故事就不一样了:
所以你可以统计
""
,因为它是CWD,但是你不能把它作为一个文件打开,因为不存在这样的文件。因此,这并不是Python的
pathlib
模块的任何假设,而是C库和内核的所有假设。o3imoua43#
稍微偏离主题:我想有一个Path的布尔值为False。似乎是不可能的。我在argparse中用type= Path做了这件事。我怀疑OP想要类似的东西。
最后我使用了两个选项中的一个,如果我可以简单地测试“if the_possibly_false_Path:...”,那么这两个选项都不像它那样“优雅”。
1.将默认值(我希望测试为False)设置为类似'%%'的值,这会导致argparse创建一个名为“%%”的Path,然后我可以测试它
1.将结果保留为默认类型,将默认值设置为测试False的值,然后在该值不为False时调用Path构造函数。