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

fma*_*ark 275 python command-line getopt optparse argparse

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

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

Nic*_*ght 308

截至python 2.7,optparse已被弃用,并有望在将来消失.

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

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

更多信息也在PEP 389中,它是将argparse其作为标准库的载体.

  • 自定义类型的简单界面......但整体界面更复杂.我真的很想知道为什么我甚至切换到optparse,因为*drumroll*getopt会*留*.是的,对那只恐龙没有弃用.Sheeesh. (17认同)
  • 在PEP中提到"optparse"的"纯度"然后后来关于加入它的复杂程度的论点使它听起来像是被编码为像摇滚一样灵活(很差). (4认同)

Ale*_*lli 60

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

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

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

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

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

您可能会在文档中提出关于旧方法被"弃用"的威胁抱怨,但是(只要您需要保持向后兼容性),如果不阻止大型重要应用程序迁移到较新的Python版本,您就无法将它们带走.

(困难的第二,与你的问题没有直接关系,在旧的说法中总结出来"标准库是好包装去死的地方"......每年都有一半左右的发布,包装不是很好,非常稳定,不需要经常发布,实际上可能会因为在标准库中"冻结"而遭受严重影响......但是,这确实是一个不同的问题).

  • Argparse仅对某些(利基?)用途更好.从绝对意义上来说,这并不是更好,它是*不同*.它可以做optparse不能做的事情,但它也有回归.我刚刚碰到的一个例子:optparse默认处理" - "(不确定它是做了应该做的),而argparse不知道它的任何内容. (2认同)

Ned*_*der 34

添加Python的理由的最佳来源是它的PEP:PEP 389:argparse - 新命令行解析模块,特别是标题为" 为什么不getopt和optparse足够?"的部分?


lon*_*ony 16

街区还有新的孩子!

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

如果您需要更深入的比较,请阅读此内容,您最终可能会使用docopt点击.感谢Kyle Purdon!

  • 虽然这是一个值得评论,它仍然是一个评论而不是一个答案..没有downvote,但也没有为我投票!通过有用的文章摘要扩展您的答案,使其成为一个真正的答案!:https://meta.stackexchange.com/a/8259/172394 (3认同)

Ray*_*Luo 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(是的,我以前不知道。)

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