我具有字符串格式的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
答案 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()