注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

比较选项解析库

比较选项解析库

注意:此页面仅供历史参考。getopt-sig 已退役,Optik 已于 Python 2.3 中添加到 Python 标准库(作为 optparse)。(它于 2002 年 11 月提交到 Python 的 CVS 树,并于 2003 年 7 月首次发布。)

自从我提议将 Optik 纳入 Python 标准库以来,许多其他选项解析库也浮出水面。我正尝试通过使用不同的库实现相同的实际命令行界面来评估它们。目前,已存在以下实现:

  • Greg Ward (也就是我) 的 Optik
  • Russ Cox 的迭代器接口 (ArgParser)
  • Albert Hofkamp 的 argtools (页面不再可用)
  • David Boddie 的 CMDSyntax (页面不再可用)

用户界面

我选择实现的界面是我的 ripoff CD 抓取脚本的界面。此界面的主要特点是

  • 直接、标准的接口(选项之间没有复杂的交互)
  • 数量可观(约 17 个)的选项——足够多,使得某种高级命令行解析帮助非常有用,但又不会多到我需要永远重新实现该界面多次
  • 各种选项类型和操作(用 Optik 的术语来说)(但没有什么真正神秘或不寻常的)
  • 不接受或不允许位置参数——即,Ripoff 需要知道的一切都可以从命令行选项中获取。

为了具体起见,这里是 Ripoff 的帮助文本(由 Optik 生成)。

Ripoff 命令行界面的一个弱点是,一些标志选项没有对应的负面选项:例如,有一个 --keep-tmp 选项,但没有 --no-keep-tmp。这种功能在实际应用中确实是必要的,因为程序的默认设置(本例中为 no-keep-tmp)可能会被配置文件覆盖,然后又被命令行再次覆盖。这个弱点目前体现在我的所有三个测试重新实现中。

内部接口

在内部,Ripoff 通过传递一个包含所有命令行值的单一对象来工作。例如,用户选择的详细级别在 options.verbose 中,CD-ROM 设备文件在 options.device 中。选项值的数量并不完全等于选项的数量:-v/--verbose 选项和 -q/--quiet 都会更新 options.verbose,而 -p/--use-pipes 和 -f/--use-files 都会更新 options.use_pipes 标志。

我在所有测试重新实现中都保留了这一点。这对 Optik 有利(因为它已经将选项值放入一个专用对象中);对迭代器版本影响不大(只是意味着更多的输入);但它让 argtools 看起来很糟糕,因为我必须将所有选项值从解析器对象显式复制到我的专用选项值对象。

现在,女士们,先生们……

废话少说,好戏开场!首先,关于这三个重新实现的一些简单统计
总代码量[1] 代码量 (无帮助)[2]
Optik 6234
迭代器11273
argtools10869
注意事项
  1. 根据 Dinu Gherman 的 pycount 报告——即,这是实际代码行数,不包括空行、注释或文档字符串(但包括字面字符串,如帮助和使用文本)
  2. 即,删除了所有显式帮助文本。对于 ArgParser 和 argtools,这只是一个大的字面字符串,因为这些库不自动生成帮助。对于 Optik,这只是意味着从每个选项中删除 help 参数;即使删除了这种按选项的帮助文本,Optik 仍然提供一个 --help 选项,报告哪些选项可用

但正如马克·吐温所说:有谎言,该死的谎言,还有统计数据。所以让我们来看看代码。

  • ripoff_optik.py 是使用 Optik 实现的 Ripoff 命令行界面(当然是从 Ripoff 源代码中直接剪切出来的)
  • ripoff_iterator.py 是使用 Russ Cox 的迭代器接口重新实现的版本
  • ripoff_argtools.py 是使用 Albert Hofkamp 的 argtools 重新实现的版本
  • 由 David Boddie 提供的 CMDSyntax 示例代码 (页面不再可用)

如果您想在不修改任何代码的情况下运行这些代码,您需要从 Ripoff 的 CVS 仓库获取其源代码。这是因为我需要 1) 一个真实的 --version 选项(它使用 ripoff.__version__),以及 2) -d/--device 选项的真实帮助(它依赖于 ripoff.cdrom 扩展模块,特别是 get_default_device() 函数)。不过,这里的真正目的是检查代码,而不是运行它。