2013-03-18 56 views
6

我目前脚本在Python中,但我想尝试Ruby的几个原因。我在上周看过很多示例代码并阅读了大量文档。我所关心的一个问题是Ruby中没有适当的命令行参数解析库。 Ruby专家,不要生我的气 - 也许我不知道。这就是我来这里的原因。红宝石optparse限制

在Python中,我习惯于使用​​,这在我看来是完美的(也许是为了我的需要)。不幸的是,OptionParser不允许灵活性和​​的功能。

我专门找在下面的约束现在:

  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或其他库处理这些制约因素?

回答

10

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> 
+0

哇。这是疯了。史诗。期。 这么长时间以来我一直在做什么。太棒了。非常感谢。 – p0lAris 2013-03-19 01:11:57