问题:为什么要使用argparse而不是optparse?
我注意到Python 2.7文档还包含另一个命令行解析模块。除了getopt
和optparse
我们现在有argparse
。
为什么还要创建另一个命令行解析模块?为什么要使用它代替optparse
?我应该了解一些新功能吗?
回答 0
从python开始2.7
,optparse
已弃用,希望将来会消失。
argparse
由于其原始页面(https://code.google.com/archive/p/argparse/)上列出的所有原因而更好:
- 处理位置参数
- 支持子命令
- 允许其他可选前缀,例如
+
和/
- 处理零个或多个和一个或多个样式参数
- 产生更多有用的使用信息
- 为自定义类型和操作提供更简单的界面
PEP 389中也提供了更多信息,它是将argparse
其纳入标准库的工具。
回答 1
为什么要使用它代替optparse?是我应该知道的新功能吗?
我认为,@ Nicholas的答案可以很好地解决这一问题,但您不能从以下的“元”问题开始:
为什么还要创建另一个命令行解析模块?
将任何有用的模块添加到标准库中时,这就是两难的境地:当出现一种提供更好的,但向后不兼容的,提供相同功能的方法时,您该怎么办?
您要么坚持旧的,公认的超越方式(通常在谈论复杂的软件包时:异步,扭曲,tkinter,wx或Qt等),要么最终以多种不兼容的方式完成同一件事(XML与命令行解析器相比,恕我直言的解析器是一个更好的例子-但email
与处理类似问题的无数旧方法相比,程序包和它们之间的距离也不远;-)。
您可能会在文档中对过时的“过时”方式进行抱怨,但是(只要需要保持向后兼容性)就不能真正消除它们,而必须停止大型的重要应用程序迁移到较新的Python版本。
(第二个难题,与您的问题没有直接关系,总结成一句老话:“标准库是好的软件包将要消亡的地方……”每年约有一半的版本发布,但不是非常好的软件包,非常稳定,不需要经常发布的版本,实际上可能会因为在标准库中被“冻结”而遭受严重损失……但这确实是一个不同的问题)。
回答 2
添加Python原理的最佳来源是其PEP: PEP 389:argparse-新的命令行解析模块,尤其是标题为“ 为什么getopt和optparse不够?”的部分。
回答 3
街上也有新孩子!
- 除了已经提到的过时的optparse。[不使用]
- argparse还提到了,这是不愿意包含外部库的人们的解决方案。
- docopt是值得研究的外部库,它使用文档字符串作为输入的解析器。
- click也是外部库,并使用修饰符定义参数。(我的来源建议:为什么单击)
- python-inquirer用于选择工具,基于Inquirer.js(repo)
如果你需要一个更深入的比较,请阅读此,你可能最终使用docopt或点击。感谢Kyle Purdon!
回答 4
起初,我像@fmark一样不愿意从optparse切换到argparse,因为:
- 我以为差异不是很大。
- 默认情况下,相当多的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(是的,我以前不知道。)
现在,我的两个问题得到了很好的解决。我写这个希望是希望它可以帮助具有类似心态的其他人。