312

我注意到 Python 2.7 文档还包含另一个命令行解析模块。除了getoptoptparse我们现在有argparse

为什么还要创建另一个命令行解析模块?为什么我应该使用它而不是optparse?是否有我应该了解的新功能?

4

5 回答 5

340

从 python 开始2.7optparse已弃用,并有望在未来消失。

argparse由于其原始页面( https://code.google.com/archive/p/argparse/ )上列出的所有原因而更好:

  • 处理位置参数
  • 支持子命令
  • 允许替代选项前缀,如+/
  • 处理零个或多个和一个或多个样式参数
  • 产生更多信息的使用消息
  • 为自定义类型和操作提供更简单的界面

更多信息也在PEP 389中,这是将argparse其纳入标准库的工具。

于 2010-07-10T03:22:22.177 回答
67

为什么我应该使用它而不是 optparse?我应该知道他们的新功能吗?

@Nicholas 的回答很好地涵盖了这一点,我认为,但不是你开始的更多“元”问题:

为什么还要创建另一个命令行解析模块?

这是将任何有用的模块添加到标准库时的第一个难题:当出现提供相同功能的更好但向后不兼容的方式时,您会怎么做?

要么您坚持使用旧的且公认已被超越的方式(通常当我们谈论复杂的包时:asyncore vs twisted,tkinter vs wx 或 Qt,...),要么您最终会以多种不兼容的方式来做同样的事情(XML解析器,恕我直言,是一个比命令行解析器更好的例子——但email包与处理类似问题的无数旧方法也相距不远;-)。

您可能会在文档中对“已弃用”的旧方式发出威胁性的抱怨,但是(只要您需要保持向后兼容性)如果不阻止大型、重要的应用程序迁移到较新的 Python 版本,您就无法真正将它们删除。

(困境之二,与您的问题没有直接关系,用一句老话“标准库是好包死去的地方”进行了总结......每年半年左右发布一次,包不是很好,非常稳定,不需要比这更频繁的发布,实际上可能会因在标准库中“冻结”而遭受重大损失......但是,这确实是一个不同的问题)。

于 2010-07-10T05:10:55.573 回答
39

添加 Python 的最佳理由是它的 PEP:PEP 389: argparse - New Command Line Parsing Module,特别是标题为“为什么 getopt 和 optparse 不够?

于 2010-07-10T03:20:46.263 回答
18

街区也有新的孩子!

  • 除了已经提到的已弃用optparse。[不使用]
  • 还提到了argparse,这是为不愿意包含外部库的人提供的解决方案。
  • docopt是一个值得一看的外部库,它使用文档字符串作为输入的解析器。
  • click也是外部库并使用装饰器来定义参数。(我的来源推荐:为什么点击
  • python-inquirer用于以选择为重点的工具,基于 Inquirer.js ( repo )

如果您需要更深入的比较,请阅读内容,您最终可能会使用docopt单击。感谢凯尔·珀登!

于 2016-03-09T22:00:13.300 回答
6

起初我和@fmark 一样不愿意从 optparse 切换到 argparse,因为:

  1. 我认为差异不是那么大。
  2. 默认情况下,相当多的 VPS 仍然提供 Python 2.6。

然后我看到了这个文档,argparse 优于 optparse,尤其是在谈论生成有意义的帮助消息时: http: //argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

然后我看到@Nicholas 的“ argparse vs. optparse ”,说我们可以在 python <2.7 中使用 argparse(是的,我以前不知道。)

现在我的两个问题得到了很好的解决。我写了这篇文章,希望它能帮助其他有类似心态的人。

于 2013-04-06T05:59:53.353 回答