Я пытаюсь создать класс 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 () принимает как единственный аргумент. Любая идея, как передать переменное число аргументов в вызов функции? Или есть лучший альтернативный способ сделать это?