Ruby optparse 限制
我现在在用Python编程,但我想尝试Ruby,原因有很多。过去一周我看了很多示例代码,也读了不少文档。有一点让我担心的是,Ruby似乎没有合适的命令行参数解析库。Ruby的专家们,别生气——也许我还不太了解这方面的知识,所以我来这里请教。
在Python中,我习惯使用argparse
,我觉得它简直完美(可能是因为我个人的需求)。但不幸的是,OptionParser
没有argparse
那样的灵活性和功能。
目前我特别关注以下几个问题:
我怎么才能创建互斥的选项列表呢?比如说,对于一个叫
test
的程序,我需要一个非常简单的选项列表。usage: test [-h] [-a | -b | -c] [-d] [filename]
我可以写一些代码,比如:
# implement a ---------------------------------------------- opts.on( "-a", "--alpha", "implement alpha") do #... end
等等。但是,这样的话,我就没办法让
a
、b
和c
互斥,除非我为这些选项写出所有可能的组合,并处理错误。比如: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()
其次,我没办法把
-d
和-a
配对,除非我专门为这个组合写代码。这太疯狂了。我必须自己写
[OPTION]
列表;我不知道自己写的对不对,除非我对所有可能的输入组合进行黑箱测试,并把它们映射到黑箱列表上。而且,强制参数也需要用特殊的代码来处理。
有没有简单的方法可以用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>