如何将(多个)正则表达式解析的函数参数传递给python函数

时间:2011-12-23 03:28:09

标签: python eval

我正在尝试构建一个解析字符串的python类,如果它匹配看起来的正则表达式 就像函数调用尝试在类上调用该函数一样,传入任何参数。

例如像“foo(”a“,20”)这样的字符串会转换为self.foo(“a”,20)之类的字符串。

这是我到目前为止的代码..

class FooTranslate(object):
    def create_string(self, letter, size):
        return letter*size

    def run_function(self, func_str):
        match = re.match("([\w_]+)\((|[\W\d\w\,]+)\)", func_str)
        if match == None:
            print "Couldn't match a regex!"
            return False
        else:
            func, fargs = match.groups()

        try:
            if fargs == "":
                return self.__getattribute__(func)()
            else:
                return self.__getattribute__(func)(eval(fargs))
        except AttributeError, e:
            print "Invalid function call: %s" % (func)
            return False

此代码适用于基本情况......

In [1018]: foot = FooTranslate()
In [1019]: foot.run_function("foo()")
Foo!
In [1020]: foot.run_function("bar(2)")
FooFoo

但是在使用2个参数函数的情况下:

In [1021]: foot.run_function("create_string('a', 2)")

in run_function(self, func_str)
     24                 return self.__getattribute__(func)()
     25             else:
---> 26                 return self.__getattribute__(func)(eval(fargs))
     27         except AttributeError, e:
     28             print "Invalid function call: %s" % (func)

TypeError: create_string() takes exactly 3 arguments (2 given)

原因是eval()调用将fargs作为元组返回,其中create_string() 仅作为一个参数。知道如何传递可变数量的参数 通过函数调用?或者有更好的替代方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用* operator将元组分解为函数的单独参数。例如:

def f(a, b, c):
    print a, b, c

如果我这样打f(...)

f((1,2,3))

我收到错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes exactly 3 arguments (1 given)

但如果我这样称呼它:

f(*(1,2,3))

我明白了:

1 2 3

如果函数采用可变数量的参数,*运算符甚至可以工作。例如,给定以下功能:

def f2(a, b, *args):
    print a, b,
    for x in args:
        print x,
    print

如果我打电话给f2(*(1,2,3,4,5)),则会打印:

1 2 3 4 5