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

Python 3.x 如何从Python代码对象构造可调用对象?,python-3.x,Python 3.x,意识到这是一个相当模糊的问题,所以我将解释为什么我要研究这个问题 pythonjit编译器接受一个callable并返回一个callable 不过,这很好——我目前使用的API使用Python代码对象 对这个问题的简单回答是编写一个函数来执行代码,例如: def code_to_function(code): def fn(): return eval(code) return fn # example use code = compile("1 + 1",

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

pythonjit编译器接受一个callable并返回一个callable

不过,这很好——我目前使用的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
def code_to_函数(代码):
def fn():
返回评估(代码)
返回fn
#示例使用
代码=编译(“1+1”,“eval”)
fn=代码到功能(代码)
打印(fn())#-->2
这是正确的,但在这种情况下,jit(碰巧是numba)不会评估实际的数字运算部分——这是有用的

所以问题是,如何获取一个计算结果为值的代码对象,并从中转换/构造一个可调用对象


更新,感谢@jsbueno的回答

上面剩余的参数可能取自您拥有的原始函数。

Edit,@jsbueno answer更好,但这可能是一个有用的替代方法,或者至少对对操作函数感兴趣的Python开发人员来说是有趣的


这可以通过替换函数属性来实现,例如:

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
def code_to_函数(代码):
def fn_dummy():
一无所获
fn_伪码。_码_;=码
返回fn_虚拟
#示例使用
代码=编译(“1+1”,“eval”)
fn=代码到功能(代码)
打印(fn())#-->2
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