我应该如何将Python元组的字符串转换为动态指定的类型?

时间:2011-09-12 16:28:07

标签: python string parsing

我正在使用cmd模块编写一个简单的Python应用程序来提供CLI类型的接口。我的CLI提供的命令具有不同的参数列表。每个命令处理程序接收一个字符串参数,该参数包含包含参数的行部分;我计划使用shlex.split将它们标记为元组。随后,我正在寻找最恐怖的方法来获取字符串元组,验证它们是否格式正确,并将它们转换为一个干净指定的数字类型的元组。

示例:我有一个函数foo,它有3个参数:第一个是磁盘上文件的路径,第二个是浮点值,第三个是一个整数,如:

foo /home/jason/file.bin 123.456 123456

我想要一种干净的方式来指定这个,类似于使用格式字符串为sscanf()的C "%s %f %d"(我理解该方法中固有的空白处理问题;它只是一个插图)。

我知道我可以通过为调用int()float()等的每个处理程序函数编写样板代码来完成此操作,并适当地捕获异常。似乎应该有一种更清洁的方式来做到这一点。

2 个答案:

答案 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))