为什么使用argparse而不是optparse?
我注意到,Python 2.7 的文档里又增加了一个命令行解析模块。除了之前的 getopt
和 optparse
,现在还有了 argparse
。
为什么又要创建一个新的命令行解析模块呢?我为什么要用它而不是 optparse
?有没有什么新功能是我需要了解的?
5 个回答
想要了解为什么要在Python中增加这个功能,最好的资料就是它的PEP文档:PEP 389: argparse - 新的命令行解析模块。特别是里面有一部分叫做:为什么getopt和optparse不够用?
我为什么要用它而不是optparse?有没有我应该知道的新功能?
@Nicholas的回答已经很好地涵盖了这个问题,但你最开始提到的更“元”的问题没有涉及:
为什么又出现了一个新的命令行解析模块?
这是在标准库中添加任何有用模块时的第一个困境:当出现一种明显更好但不兼容旧版的方式来提供相同功能时,你该怎么办?
你要么继续使用旧的、显然已经被超越的方法(通常是在我们讨论复杂的包时,比如asyncore和twisted,tkinter和wx或Qt等),要么就会出现多种不兼容的方式来完成同样的事情(我认为XML解析器比命令行解析器更能说明这一点——不过email
包和许多旧的处理类似问题的方法之间的差异也不远了;-)。
你可能会在文档中威胁性地提到旧的方法被“弃用”,但(只要你需要保持向后兼容)你实际上不能真的把它们去掉,否则会导致一些大型、重要的应用无法升级到更新的Python版本。
(第二个困境,虽然和你的问题没有直接关系,可以用一句老话来总结:“标准库是好包去死的地方”……每隔一年半左右发布一次版本,那些不太、非常稳定的包,实际上可能会因为被“冻结”在标准库中而受到很大影响……不过,这确实是另一个问题)。
从 Python 2.7
开始,optparse
已经不再推荐使用,未来可能会被完全淘汰。
相比之下,argparse
更好,原因可以在它的原始页面上找到(https://code.google.com/archive/p/argparse/):
- 可以处理位置参数
- 支持子命令
- 允许使用不同的选项前缀,比如
+
和/
- 可以处理零个或多个、一个或多个的参数
- 提供更详细的使用信息
- 为自定义类型和操作提供了更简单的接口
更多信息可以在 PEP 389 中找到,这是 argparse
被纳入标准库的文档。