为什么要使用argparse而不是optparse?

时间:2010-07-10 03:16:00

标签: python command-line optparse getopt argparse

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

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

5 个答案:

答案 0 :(得分:296)

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

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

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

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

答案 1 :(得分:60)

  

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

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

  

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

当任何有用的模块被添加到标准库时,这就是第一个困境:当提供相同类型的功能时出现了一种更好但又向后兼容的方式,你会怎么做?

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

你可能会在文档中提出关于旧方法被“弃用”的威胁抱怨,但是(只要你需要保持向后兼容性)你不能真正地将它们带走而不会阻止大型重要应用程序转移到更新Python发布。

(与你的问题没有直接关系的第二个困境,在古老的说法中总结出来“标准库是好的软件包去死的地方”......每年都会发布一半左右的软件包,不是'非常,非常稳定,需要更频繁地发布,实际上可能会因为在标准库中被“冻结”而遭受重大损失......但是,这真的是一个不同的问题)。

答案 2 :(得分:34)

添加Python的理由的最佳来源是其PEP:PEP 389: argparse - New Command Line Parsing Module,特别是标题为Why aren't getopt and optparse enough?

的部分

答案 3 :(得分:14)

街区还有新的孩子!

  • 除了已经提到的已弃用的 optparse 。 [请勿使用]
  • 还提到了
  • argparse ,这是一个不愿意包含外部库的人的解决方案。
  • docopt 是一个值得关注的外部库,它使用文档字符串作为输入的解析器。
  • 单击也是外部lib,并使用装饰器来定义参数。 (我的来源建议:Why Click
  • python -inquirer 对于选择重点工具并基于Inquirer.js(repo

如果您需要更深入的比较,请阅读this,最后可能会使用 docopt 点击。感谢Kyle Purdon!

答案 4 :(得分:4)

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

  1. 我认为区别并不大。
  2. 相当一些VPS默认仍提供Python 2.6。
  3. 然后我看到了这个文档,argparse优于optparse,特别是在谈论生成有意义的帮助消息时:http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

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

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