我如何从字符串中获取python函数对象

时间:2019-09-05 11:23:47

标签: python python-2.7

我具有字符串格式的python函数,并且我想在程序范围内获取这些函数的python对象。我已经尝试过ActiveRecord::Base.connected?exec()eval(),但是这些都不返回函数对象。

例如:

ast.literal_eval()

这是一个简单的字符串函数,用于添加列表的元素。我正在寻找实用程序的模块,该模块可以返回函数s = "def add(args):\n try:\n return sum([int(x) for x in args])\n except Exception as e:\n return 'error'\n

的对象
add

5 个答案:

答案 0 :(得分:4)

首先将函数(作为字符串)编译为代码对象,即

code_obj = compile(s, '<string>', 'exec')

,然后使用types.FunctionType从代码对象创建新的函数类型。

>>> import types
>>> new_func_type = types.FunctionType(code_obj.co_consts[0], globals())
>>> print(type(new_func_type))
<class 'function'>
>>> new_func_type([*range(10)])
45

答案 1 :(得分:1)

在Python 2中,您可以为exec提供一个globals字典:

globalsdict = {}
exec s in globalsdict

然后globalsdict ['add']将成为您的函数对象。 Globalsdict也将包含所有内置函数。

答案 2 :(得分:1)

一种方法(可能会有更好的方法)是:

>>> s = "def add(args):\n    try:\n        return sum([int(x) for x in args])\n    except Exception as e:\n        return 'error'"
>>>
>>> def create_func_obj(func_code_str):
...     g = dict()
...     l = dict()
...     exec(func_code_str, g, l)
...     if l:
...         return list(l.values())[0]
...
>>>
>>> func = create_func_obj(s)
>>>
>>> func
<function add at 0x000002952F0DEC80>
>>> func([1, 2, 3])
6
>>>
>>> add  # The function wasn't added in the global namespace (as an exec sideeffect)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'add' is not defined

如果代码字符串除了一个函数的定义之外还包含其他内容,则结果将不是预期的结果。

答案 3 :(得分:0)

要通过字符串创建方法,请执行以下操作:

exec(s)
print add([1,2])

答案 4 :(得分:0)

a = \
'''def fun():\n
    print 'result'
'''
exec(a)

fun()