2011-12-23 13 views
1

文字列を解析するPythonクラスを構築しようとしています。 のような正規表現と一致する場合は、その関数を任意のパラメータを渡します。例えば ​​"FOO(" A」、20 ")のような文字列は"(A "20)self.fooのようなものに変換するだろう"正規表現の解析関数のパラメータをPython関数に渡す方法

ここで私がこれまで持っているコードです。 。2つの引数関数を用いた場合にはしかし

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つの引数として取るためです。どのように私は引数の可変数を渡すことができる任意の考え を介して関数呼び出し?またはこれを行うためのより良い代替方法がありますか?

+0

はevalのに安全な代替として 'ast.literal_eval()'を見てください。 – Duncan

答えて

1

* operatorを使用すると、タプルを関数の別の引数に分解できます。私はこのようなf(...)を呼び出した場合

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

は:たとえば

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 

*オペレータは、関数が可変数の引数を取る場合でも機能します。たとえば、次の関数与えられた:私はそれを印刷しf2(*(1,2,3,4,5))呼び出す場合

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

を:

1 2 3 4 5 
+0

これは私が探している答えです、ありがとう!誰かがこれを行うより良い方法を持っている(つまりevalを使用していない)場合、それは非常に便利です。 – Andrew

関連する問題