2015-09-07 49 views
0

我有一个由字符串给出的函数内容。我正在寻找一种方法如何将此字符串转换为函数对象来调用它。如何提取由Python中的内容字符串给出的函数

content = "def my_function(x):\n return x**2" 
my_function = extract_function_from_string(content) # extract_function_from_string ??? 
print my_function(5) # prints 25 

也许,有字符串从中

+3

@AvinashRaj给定一个函数不是一个文字,这会有什么帮助? ast.parse是OP正在寻找的东西。 – jonrsharpe

+0

这不是一个好方法。也许,有一种方法可以将字符串转换为python模块并从中提取函数 – Fomalhaut

+0

那么你可以将它保存到一个文件然后'导入',但为什么不看看'ast'能为你做什么? – jonrsharpe

回答

1

如果你知道函数名,你可以在字符串运行EXEC。 Eval将不起作用,因为它只针对表达式。见\r\n vs \n in python eval function。如果你不知道这个功能的名字,但所有的功能具有相同的格式,你可以尝试这样的事:

def extract_function_from_string(content): 
    exec(content) 
    start = 4 
    end = content.find("(") 
    function_name = content[start:end] 
    return eval(function_name) 
my_function = extract_function_from_string("def my_function(x):\n return x**2") 
print my_function(5) 

火车已经离开安然无恙蟒蛇站很久以前的事,但我猜这只是一个好奇心。

-1

转换成一个Python模块和提取功能,可以使用eval函数来做到这一点的方式。例如的eval( “打印( '你好')”)。

但是,请注意,这可能是一个安全风险,并且可能有比解析字符串更好的方法。

+1

尝试运行'eval(“def my_function(x):\ n return x ** 2”)' – Andrey

-3

一个= “拉姆达X:X ** 2”

my_func,并将= EVAL(一)

打印my_func,并将(3)

+1

您是否尝试运行它 – The6thSense

+0

函数**不是字面值** – jonrsharpe

+0

这将与'lambda'一起使用,但失败命名的函数像'def f'。你可以建议这个专门用于lambda表达式,但是你应该解释它是如何在你的答案中起作用的,而不仅仅是转储代码。 – SuperBiasedMan

1

可以使用exec

>>>content = "def my_function(x):\n return x**2" 
>>>exec content 
>>>my_function(5) 
25 

对于Python 3.x

>>>exec(content) 
1

尝试exec声明:

>>> content = "def my_function(x):\n return x**2" 
>>> exec content 
>>> my_function(5) 
25 
0

这里是一些不完整的蟒蛇安全列车。

def extract_function_from_string(content, function_index=0): 
    import ast 
    tree = ast.parse(content, mode='exec') 
    function = tree.body[function_index] 
    module = ast.Module([function]) 
    exec(compile(module, filename="<ast>", mode='exec')) 
    return locals()[function.name] 

content = "def my_function(x):\n return x**2" 
my_function = extract_function_from_string(content) # extract_function_from_string ??? 
print(my_function(5)) # prints 25