意识到这是一个相当模糊的问题,所以我将解释为什么我要调查这个问题。
Python jit编译器接受一个可调用的并返回一个可调用的。
这很好,但是我正在使用的API使用的是Python代码对象。
这个问题的简单回答是编写一个执行代码的函数,例如:
def code_to_function(code):
def fn():
return eval(code)
return fn
# example use
code = compile("1 + 1", '<string>', 'eval')
fn = code_to_function(code)
print(fn()) # --> 2
哪个是正确的,但在这种情况下jit(恰好是numba),不会评估实际的数字运算部分 - 这需要有用。
所以问题是,如何获取一个计算值的代码对象,并从中转换/构造一个callable?
更新,感谢@ jsbueno的答案,here's an example of a simple expression evaluator using numba。
答案 0 :(得分:3)
from types import FunctionType
new_function = FunctionType(code, globals[, name[, argdefs[, closure]]])
上面的其余参数可以从您拥有的原始功能中获取。
答案 1 :(得分:0)
编辑,@ jsbueno答案更好,但这可能是一个有用的替代方案,或者至少对有兴趣操作函数的Python开发人员感兴趣。
这可以通过替换函数__code__
,attrubute来完成,例如:
def code_to_function(code):
def fn_dummy():
return None
fn_dummy.__code__ = code
return fn_dummy
# example use
code = compile("1 + 1", '<string>', 'eval')
fn = code_to_function(code)
print(fn()) # --> 2