我注意到Python 2.7文档包含另一个命令行解析模块。除了getopt
和optparse
之外,我们现在还有argparse
。
为什么还要创建另一个命令行解析模块?我为什么要使用它代替optparse
?是否有我应该了解的新功能?
答案 0 :(得分:296)
从python 2.7
开始,optparse
已被弃用,并且有望在将来消失。
argparse
因其原始页面上列出的所有原因(https://code.google.com/archive/p/argparse/)而更好:
+
和/
更多信息也在PEP 389中,这是argparse
将其纳入标准库的工具。
答案 1 :(得分:60)
我认为,@ Nicholas的回答很好地涵盖了这个问题,但不是你开始的更“元”问题:我为什么要用它而不是 optparse?是他们的新功能吗? 应该知道吗?
为什么还有另一个命令行 解析模块已创建?
当任何有用的模块被添加到标准库时,这就是第一个困境:当提供相同类型的功能时出现了一种更好但又向后兼容的方式,你会怎么做?
要么你坚持旧的和公认的超越方式(通常当我们谈论复杂的包: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)
街区还有新的孩子!
如果您需要更深入的比较,请阅读this,最后可能会使用 docopt 或点击。感谢Kyle Purdon!
答案 4 :(得分:4)
起初我和@fmark一样不愿意从optparse切换到argparse,因为:
然后我看到了这个文档,argparse优于optparse,特别是在谈论生成有意义的帮助消息时:http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
然后我看到@Nicholas的“argparse vs. optparse”,说我们可以在python< 2.7中使用argparse(是的,之前我不知道。)
现在我的两个问题得到了很好的解决。我写了这篇文章,希望能帮助其他有类似心态的人。