【问题标题】:Which path module or class do Python folks use instead of os.path?Python 人员使用哪个路径模块或类来代替 os.path?
【发布时间】:2009-08-10 00:03:40
【问题描述】:

只是想知道有多少人使用 Python 中的路径模块,例如 Jason Orendorff 的路径模块,而不是使用 os.path 来连接和分割路径?你用过吗:

我知道 Jason 的路径模块被制作成 PEP 355 并被 BDFL 拒绝。这似乎主要是因为它试图在一个班级中做所有事情。

我们的用例主要是简化路径的连接和拆分组件,所以如果这样的路径类只实现拆分/连接类型的操作,我们会非常高兴。谁不想这样做:

path(build_dir, path(source_file).name)

或者这个:

build_dir / path(source_file).name

而不是这个:

os.path.join(build_dir, os.path.basename(source_file))

【问题讨论】:

标签: python path


【解决方案1】:

我可以毫不犹豫地选择一个 Python 程序并解释当前的标准方法 - 它是明确的,没有歧义:

os.path.join(build_dir, os.path.basename(source_file))

Python 的动态类型使得第一种方法在阅读时相当难以理解:

build_dir / path(source_file).name

另外,分割字符串并不常见,这会带来更多的混乱。我怎么知道这两个不是整数?还是漂浮?如果两者都以非字符串类型结束,则在运行时不会出现 TypeError。

最后,

path(build_dir, path(source_file).name)

这比 os.path 方法好多少?

虽然他们可能会“简化”编码(即,更容易编写),但如果其他不熟悉替代模块的人需要维护代码,您就会陷入冲突。

所以我想我的答案是:我不使用替代路径模块。 os.path 已经拥有我需要的一切,而且它的界面也不错。

【讨论】:

  • 听听!标准 os.path 模块并没有什么可怕的错误,可以保证向您的项目添加更多依赖项。如果您有一个特别棘手的路径构造问题,例如从对象层次结构中构造路径,那么为什么不将其包装在一个函数中呢?下一位程序员会感谢你封装它,并感谢你没有让他学习和调试整个其他模块。
  • 谢谢你的回答,马修。好的评论,Theran:你对将事物分解为函数是正确的——这已经简化了我的脚本。事实上,我认为你们两个已经说服了我们。另外,如果我们只是想要更简洁一点,我想总会有“从操作系统导入路径”。
  • 没有歧义,正确,但写起来很痛苦,读起来很痛苦。我宁愿处理像 Java 的 java.nio.file.Path 这样的不可变 Path 对象,而不是字符串。示例:with build_dir.child('config.yaml').open() as f vs with open(os.path.join(build_dir, 'config.yaml')) as f -- 逻​​辑流程更一致地从左到右,嵌套括号更少,因此更易于阅读和理解。
【解决方案2】:

一个简单但有用的技巧是:

导入操作系统

路径 = os.path.join

然后,而不是这个:

os.path.join(build_dir, os.path.basename(source_file))

你可以这样做:

路径(构建目录,路径(源文件))

【讨论】:

  • 我一直这样做,但我使用pj 而不是Path。 :-)
  • 您愿意解释一下为什么可以用Path = os.path.join 的另一个实例替换os.path.basename 吗?因为对我来说,os.path.join(r"C:\Build", os.path.basename(r"D:\Source\Code.py")) 返回'C:\\Build\\Code.py',而Path(r"C:\Build", Path(r"D:\Source\Code.py")) 返回'D:\\Source\\Code.py'
【解决方案3】:

分割字符串以连接路径可能看起来像是一个“巧妙的技巧”,但这正是 Python 程序员喜欢避免的那种事情(顺便说一句,大多数其他语言的程序员)。os.path 模块被广泛使用且易于使用被所有人理解。另一方面,使用重载运算符做一些时髦的事情会让人困惑,它会损害代码的可读性,而这正是 Python 的强项之一。

另一方面,C++ 程序员喜欢这种东西。也许这就是 C++ 代码难以阅读的原因之一。

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 2018-10-16
    • 2022-01-12
    • 1970-01-01
    • 2022-11-03
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多