【问题标题】:How to execute code returned from inspect.getsource如何执行从 inspect.getsource 返回的代码
【发布时间】:2020-05-20 14:33:54
【问题描述】:

我正在使用 python,我从函数调用 inspect.getsource(func) 中检索另一段代码

我想执行代码并获取函数的返回值。

这是我目前的代码:

def f():
    a = 1
    v = 2
    return 1

import inspect
st = inspect.getsource(f)
b = exec(st)
print(b)

但目前我看到下面显示的输出。

我在这里缺少什么?我希望它执行该函数并返回它应该提供的返回值,就好像我只是调用该函数一样。

欢迎您的提示和建议。

【问题讨论】:

  • 如果您有对该函数的引用,那么 只需调用该函数 - 检索该函数的源代码然后重新编译它可能会产生一个不工作(或至少非等效)函数,因为全局环境与包含原始函数的模块不同。
  • @jasonharper - 我需要函数的代码,并且能够执行它
  • 我很好奇,你需要这个做什么?

标签: python python-3.x metaprogramming node-inspector code-inspection


【解决方案1】:

exec 没有返回任何内容。您可以改为为它分配一些东西,如下所示:

def f():
    a = 1
    v = 2
    return 1

import inspect
st = inspect.getsource(f) + '\nret=f()'
exec(st)
print(ret)  # prints 1

这里还有一个选项,但是很丑……

In [65]: def f():
    ...:     a = 1
    ...:     v = 2
    ...:     return 1
    ...:

In [66]: def my_exec(func):
    ...:     try:
    ...:         code = inspect.getsource(func)
    ...:         func_name = func.__name__
    ...:         exec('global ret\n{}\nret={}()'.format(code, func_name))
    ...:         global ret
    ...:         return ret
    ...:     except IOError:
    ...:         return None
    ...:

In [67]: my_exec(f)
Out[67]: 1

这将创建一个全局ret,定义函数然后运行该函数,将返回分配给ret。最后,它返回 ret 包含的任何内容。通过定义您自己的 exec 函数,您可以更好地控制之前/之后发生的事情。

【讨论】:

  • 是否有其他解决方案可以执行检查返回的内容?
  • @thebeancounter 我给出了另一个在某种程度上定义你自己的 exec 方法的例子。你有什么特别要找的吗?
  • 刚刚发现 dill 解决这个问题要容易得多,您想更改答案以使用它吗? dill.loads(dill.dumps(func))()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
相关资源
最近更新 更多