如何从Python代码对象构造可调用对象?

时间:2016-03-17 03:57:32

标签: python-3.x

意识到这是一个相当模糊的问题,所以我将解释为什么我要调查这个问题。

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

2 个答案:

答案 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