Ruby optparse 限制

8 投票
1 回答
2106 浏览
提问于 2025-04-17 19:34

我现在在用Python编程,但我想尝试Ruby,原因有很多。过去一周我看了很多示例代码,也读了不少文档。有一点让我担心的是,Ruby似乎没有合适的命令行参数解析库。Ruby的专家们,别生气——也许我还不太了解这方面的知识,所以我来这里请教。

在Python中,我习惯使用argparse,我觉得它简直完美(可能是因为我个人的需求)。但不幸的是,OptionParser没有argparse那样的灵活性和功能。

目前我特别关注以下几个问题:

  1. 我怎么才能创建互斥的选项列表呢?比如说,对于一个叫test的程序,我需要一个非常简单的选项列表。

    usage: test [-h] [-a | -b | -c] [-d] [filename]
    

    我可以写一些代码,比如:

    # implement a ----------------------------------------------
    opts.on( "-a", "--alpha",
             "implement alpha") do
        #...
    end
    

    等等。但是,这样的话,我就没办法让abc互斥,除非我为这些选项写出所有可能的组合,并处理错误。比如:

    test -ab #should through an error
    

    在Python中,我可以很简单地做到这一点:

    # create an command line argument parser object
    cmd_line_parser = argparse.ArgumentParser()
    
    # create a mutually exclusive group
    cmd_line_group = cmd_line_parser.add_mutually_exclusive_group()
    
    1. 其次,我没办法把-d-a配对,除非我专门为这个组合写代码。这太疯狂了。

    2. 我必须自己写[OPTION]列表;我不知道自己写的对不对,除非我对所有可能的输入组合进行黑箱测试,并把它们映射到黑箱列表上。

    3. 而且,强制参数也需要用特殊的代码来处理。

有没有简单的方法可以用optparse或其他Ruby库来处理这些问题呢?

1 个回答

11

有一个叫做 docopt 的库,它同时支持 Python 和 Ruby 这两种编程语言。下面是 test 程序的规范:

usage: test [-h] [-a | -b | -c] [-d] [<filename>]

选项 a、b、c 是互斥的,也就是说你不能同时使用它们(比如 -ab 会报错),但是它支持组合选项,比如 -ad-da 等等。

如果想让 filename 参数变成必填的:

usage: test [-h] [-a | -b | -c] [-d] <filename>

撰写回答