我正在使用cmd
模块编写一个简单的Python应用程序来提供CLI类型的接口。我的CLI提供的命令具有不同的参数列表。每个命令处理程序接收一个字符串参数,该参数包含包含参数的行部分;我计划使用shlex.split
将它们标记为元组。随后,我正在寻找最恐怖的方法来获取字符串元组,验证它们是否格式正确,并将它们转换为一个干净指定的数字类型的元组。
示例:我有一个函数foo
,它有3个参数:第一个是磁盘上文件的路径,第二个是浮点值,第三个是一个整数,如:
foo /home/jason/file.bin 123.456 123456
我想要一种干净的方式来指定这个,类似于使用格式字符串为sscanf()
的C "%s %f %d"
(我理解该方法中固有的空白处理问题;它只是一个插图)。
我知道我可以通过为调用int()
,float()
等的每个处理程序函数编写样板代码来完成此操作,并适当地捕获异常。似乎应该有一种更清洁的方式来做到这一点。
答案 0 :(得分:2)
根据您使用的是Python 2.6还是2.7,您可以分别使用内置的optparse或argparse。
http://docs.python.org/library/argparse.html
它们可能稍微重量级,但它们会转换为整数,浮点数或解析过程中所需的任何类型,并且它可以自动构建用法消息和其他好的参数解析事物。
答案 1 :(得分:2)
我建议将生产规则作为解析参数的函数提供,并为无效参数引发异常。所以。您的示例可能如下所示:
FOO_SYNTAX = (file, float, int)
def foo_cmd(infile, infloat, inint):
pass
def parse_args(rule, args):
if len(rule) != len(args):
raise ValueError, "Wrong number of arguments"
return [rule_item(arg) for rule_item, arg in zip(rule, args)]
COMMANDS = {'foo': (FOO_SYNTAX, foo_cmd)}
def dispatch(line):
cmd, rest = line.split(None, 1)
args = rest.split()
syntax, cmd_func = COMMANDS[cmd]
cmd_func(*parse_args(syntax, args))