为什么使用argparse而不是optparse?

332 投票
5 回答
161575 浏览
提问于 2025-04-16 01:05

我注意到,Python 2.7 的文档里又增加了一个命令行解析模块。除了之前的 getoptoptparse,现在还有了 argparse

为什么又要创建一个新的命令行解析模块呢?我为什么要用它而不是 optparse?有没有什么新功能是我需要了解的?

5 个回答

41

想要了解为什么要在Python中增加这个功能,最好的资料就是它的PEP文档:PEP 389: argparse - 新的命令行解析模块。特别是里面有一部分叫做:为什么getopt和optparse不够用?

67

我为什么要用它而不是optparse?有没有我应该知道的新功能?

@Nicholas的回答已经很好地涵盖了这个问题,但你最开始提到的更“元”的问题没有涉及:

为什么又出现了一个新的命令行解析模块?

这是在标准库中添加任何有用模块时的第一个困境:当出现一种明显更好但不兼容旧版的方式来提供相同功能时,你该怎么办?

你要么继续使用旧的、显然已经被超越的方法(通常是在我们讨论复杂的包时,比如asyncore和twisted,tkinter和wx或Qt等),要么就会出现多种不兼容的方式来完成同样的事情(我认为XML解析器比命令行解析器更能说明这一点——不过email包和许多旧的处理类似问题的方法之间的差异也不远了;-)。

你可能会在文档中威胁性地提到旧的方法被“弃用”,但(只要你需要保持向后兼容)你实际上不能真的把它们去掉,否则会导致一些大型、重要的应用无法升级到更新的Python版本。

(第二个困境,虽然和你的问题没有直接关系,可以用一句老话来总结:“标准库是好包去死的地方”……每隔一年半左右发布一次版本,那些不太、非常稳定的包,实际上可能会因为被“冻结”在标准库中而受到很大影响……不过,这确实是另一个问题)。

360

从 Python 2.7 开始,optparse 已经不再推荐使用,未来可能会被完全淘汰。

相比之下,argparse 更好,原因可以在它的原始页面上找到(https://code.google.com/archive/p/argparse/):

  • 可以处理位置参数
  • 支持子命令
  • 允许使用不同的选项前缀,比如 +/
  • 可以处理零个或多个、一个或多个的参数
  • 提供更详细的使用信息
  • 为自定义类型和操作提供了更简单的接口

更多信息可以在 PEP 389 中找到,这是 argparse 被纳入标准库的文档。

撰写回答