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路径。因为与列表或字符串不同,列表或字符串在为空时(不是无,因为它们不再是列表或字符串),指向不存在的路径的路径对象仍然是一个有用的非空构造,因此