文字列を解析する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つの引数として取るためです。どのように私は引数の可変数を渡すことができる任意の考え を介して関数呼び出し?またはこれを行うためのより良い代替方法がありますか?
はevalのに安全な代替として 'ast.literal_eval()'を見てください。 – Duncan