Python 路径(';foo';)的缺点。存在()!=bool(Path(';foo';)

Python 路径(';foo';)的缺点。存在()!=bool(Path(';foo';),python,pathlib,Python,Pathlib,试图将我的问题重新表述为较少基于观点 当文件系统路径不存在时,pathlib.Path对象强制/计算为False有什么不利之处 例如,pathlib.Path可以使用任何\uuuu bool\uuuu逻辑编写,因为它只是一个Python类 class Path(object): def __init__(self, path): self.path_ = path def __bool__(self): return self.checkIfEx

试图将我的问题重新表述为较少基于观点

当文件系统路径不存在时,
pathlib.Path
对象强制/计算为
False
有什么不利之处

例如,pathlib.Path可以使用任何
\uuuu bool\uuuu
逻辑编写,因为它只是一个Python类

class Path(object):
    def __init__(self, path):
        self.path_ = path

    def __bool__(self):
        return self.checkIfExistsOnFileSystemOrNot_()

    def path(self):
        return self.path_

    def checkIfExistsOnFileSystemOrNot_(self):
        # any logic here ...

    ...
我知道您可能希望构建一个python程序中不存在的文件路径,但您希望何时构建

if path:
   # do something with the path "assuming" it exits on the filesystem (and not just that it's not falsy)
我会同意的

if path.exists():
    # ...

这不是更费劲了吗?但考虑到我一直在两种语言之间跳来跳去,这给我带来了一些痛苦。

现在问题已经改变了,我在原始答案中提出的最后一点可能是最重要的:清晰

说:

显式比隐式好

可读性很重要

路径
对象上显式调用
.exists()
。一个不熟悉Python的新程序员可以阅读

如果某个路径存在():
# ...
并且可能理解它。但是

如果某个路径:
# ...
更不清楚

我一直在两种语言之间跳来跳去,这给我带来了一些痛苦

惯用Python和惯用Ruby或C#或Scala都是不同的。没关系

现在,让我们来谈谈旧答案的其余部分:

它不仅仅用于表示特定可见文件系统上的文件和文件夹。它用于表示和操作路径本身(粗体添加):

该模块提供了表示文件系统路径的类,这些类具有适合不同操作系统的语义。路径类分为(提供纯计算操作而无需I/O)和(继承自纯路径但也提供I/O操作)两类

您甚至可以在Linux系统上操作Windows样式的路径,反之亦然


将路径的真实性降低到“这个文件存在吗?”似乎是一个奇怪的设计决策。特别是当文件和目录还有其他布尔值问题时:可读吗?可写的?可执行文件?象征性的联系?目录?普通档案?先进先出?

既然问题已经改变了,我在原始答案中提出的最后一点可能是最重要的:清晰

说:

显式比隐式好

可读性很重要

路径
对象上显式调用
.exists()
。一个不熟悉Python的新程序员可以阅读

如果某个路径存在():
# ...
并且可能理解它。但是

如果某个路径:
# ...
更不清楚

我一直在两种语言之间跳来跳去,这给我带来了一些痛苦

惯用Python和惯用Ruby或C#或Scala都是不同的。没关系

现在,让我们来谈谈旧答案的其余部分:

它不仅仅用于表示特定可见文件系统上的文件和文件夹。它用于表示和操作路径本身(粗体添加):

该模块提供了表示文件系统路径的类,这些类具有适合不同操作系统的语义。路径类分为(提供纯计算操作而无需I/O)和(继承自纯路径但也提供I/O操作)两类

您甚至可以在Linux系统上操作Windows样式的路径,反之亦然


将路径的真实性降低到“这个文件存在吗?”似乎是一个奇怪的设计决策。特别是当文件和目录还有其他布尔值问题时:可读吗?可写的?可执行文件?象征性的联系?目录?普通档案?FIFO?

如果
存在
返回
如果文件不存在,如果文件确实存在,您希望它返回什么?将
None
/
True
作为返回选项似乎很奇怪。如果是
None
/file\u路径,那么我可以理解它。但是
.exists
提出了一个非常具体的布尔问题。因此,在这种情况下,布尔输出似乎很自然。.exists返回True/False,而不是NoneOh,或者您正在询问为什么整个对象
Path(“不存在路径”)
不是
None
而不是Path对象?在这种情况下,这是因为pathlib允许您使用不存在的路径。这允许您在特定位置创建文件或在Windows中使用posix路径。因为与列表或字符串不同,列表或字符串为空(不是无,因为它们不再是列表或字符串),指向不存在的路径的路径对象仍然是有用的,您可能需要使用的非空构造。您可以将对象强制为Truthy/Falsy状态,但对非空路径对象执行此操作对我来说似乎很奇怪。如果
.exists
返回
None
如果文件不存在,如果文件确实存在,您希望它返回什么?将
None
/
True
作为返回选项似乎很奇怪。如果是
None
/file\u路径,那么我可以理解它。但是
.exists
提出了一个非常具体的布尔问题。因此,在这种情况下,布尔输出似乎很自然。.exists返回True/False,而不是NoneOh,或者您正在询问为什么整个对象
Path(“不存在路径”)
不是
None
而不是Path对象?在这种情况下,这是因为pathlib允许您使用不存在的路径。这允许您在特定位置创建文件或在Windows中使用posix路径。因为与列表或字符串不同,列表或字符串在为空时(不是无,因为它们不再是列表或字符串),指向不存在的路径的路径对象仍然是一个有用的非空构造,因此