如何将(多个)正则解析的函数参数传递给Python函数

1 投票
1 回答
1763 浏览
提问于 2025-04-17 08:53

我正在尝试创建一个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

但是在使用两个参数的函数时就出现问题了:

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 个回答

1

你可以使用*运算符来把一个元组拆开,变成函数的多个参数。举个例子:

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

撰写回答