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


290

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

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


8
或者也许不使用它,因为自2012年以来,Python拥有一个简单,强大且非常的参数解析模块docopt。docopt.org
ndemou 2014年

1
尝试单击它是围绕optparse的包装。
阿米特·特里帕蒂

Answers:


324

从python开始2.7optparse已弃用,希望将来会消失。

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

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

PEP 389中也提供了更多信息,它是将argparse其纳入标准库的工具。


18
自定义类型的界面要简单得多,但总体上来说界面要复杂得多。我真的很纳闷为什么我什至改用optparse,因为drumroll getopt会留下来。是的,该恐龙没有贬值的迹象。Sheeesh。
尔根·艾哈德

4
optparse在PEP中提到“纯度”,然后再争论添加的复杂性,这听起来像是被编码为与岩石一样(较差)。
尼克T

1
子命令界面不佳。默认输出没有用,很难更改。
anatoly techtonik

请注意,code.google.com将在几天内进行维护。此处提供更多细节的区别:argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.

63

为什么要使用它代替optparse?是我应该知道的新功能吗?

我认为,@ Nicholas的答案可以很好地解决这一问题,但您不能从以下的“元”问题开始:

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

将任何有用的模块添加到标准库中时,这就是两难的境地:当出现一种提供更好的,但向后不兼容的,提供相同功能的方法时,您该怎么办?

您要么坚持旧的,公认的超越方式(通常在谈论复杂的软件包时:异步,扭曲,tkinter,wx或Qt等),要么最终以多种不兼容的方式完成同一件事(XML与命令行解析器相比,恕我直言的解析器是一个更好的例子-但email与处理类似问题的无数旧方法相比,程序包和它们之间的距离也不远;-)。

您可能会在文档中对过时的“过时”方式进行抱怨,但是(只要需要保持向后兼容性)就不能真正消除它们,而必须停止大型的重要应用程序迁移到较新的Python版本。

(第二个难题,与您的问题没有直接关系,总结成一句老话:“标准库是好的软件包将要消亡的地方……”每年约有一半的版本发布,但不是非常好的软件包,非常稳定,不需要经常发布的版本,实际上可能会因为在标准库中被“冻结”而遭受严重损失……但这确实是一个不同的问题)。


诚然,您可以在2.7之前的python安装中包含argparse.py,而不必担心向后不兼容的更改。尚需跟踪,但仍在argparse.googlecode.com的标准库之外进行维护
Ehtesh Choudhury 2013年

2
Argparse仅在某些用途(利基?)上要好得多。从绝对意义上讲,它并没有真正更好,而是有所不同。它可以做optparse不能做的事情,但是它也具有回归功能。我刚遇到一个示例:optparse默认情况下处理了“-”(不确定它做了应做的事情),而argparse却一无所知。
尔根·艾哈德

对于迟到上述评论的任何人,argparse都设置了前缀和名称,大多数解析器写为parser.add_argument('--long-opt', '-l',...);'-'易于处理,但是您喜欢。
SilverbackNet


18

街上也有新孩子!

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

如果你需要一个更深入的比较,请阅读,你可能最终使用docopt点击。感谢Kyle Purdon!


4
虽然这是一个有价值的评论,但它仍然是一个评论,而不是一个答案。。用有价值的文章摘要扩展您的答案,使之成为一个真实的答案!:meta.stackexchange.com/a/8259/172394
Stefano

1
我试图包括我的链接的摘要,我希望现在值得一个很好的stackoverflow答案。
lony

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.