2011-12-23 60 views
1

我试图构建一个解析字符串的python类,如果它匹配的正则表达式看起来像一个函数调用尝试调用该函数的正则表达式 类,传入任何参数。如何将(多个)正则表达式解析函数参数传递给一个python函数

例如像 “富(” 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() 仅将一个参数作为参数。任何想法如何我可以通过一个函数调用传递可变数量的参数 ?或者有更好的替代方法来做到这一点?

+0

看一看'ast.literal_eval()'作为一个更安全的替代EVAL。 – Duncan

回答

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 
+0

我怀疑这是我正在寻找的答案,谢谢!如果任何人有更好的方法(即不使用eval),这将是非常有用的。 – Andrew

相关问题