如何在Python中调用代码对象

时间:2016-11-09 11:01:24

标签: python unit-testing introspection

当我抓住一个代码对象时(通过像.func_code这样的内部),是否有任何方式调用这段代码?简单地调用它不起作用:

def f(): pass

f.func_code()

结果

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'code' object is not callable

当您想对嵌套函数进行单元测试时,这可以派上用场:

def f():
  def g():
    return 3
  f.x = g
  return g() + 1

f.func_code.co_consts[1]

结果

<code object g at 0x7f123991b930, file "<stdin>", line 2>

当然,这段代码仍然需要上下文等等,但这不是我的问题。

1 个答案:

答案 0 :(得分:0)

他们可以eval()exec

如果他们有自由变量(例如,对于外部函数在嵌套函数之前定义了局部变量的嵌套函数的代码),这不可能直接实现(eval或{{ 1}}在这种情况下提出exec

此外,不能直接将参数传递给代码。

但是可以在运行中为给定代码创建包装函数。通常可以调用此函数(使用TypeError),以通常的方式传递参数。这是使用f(…)完成的。要实现对自由变量的引用,必须使用技巧来获得Python期望的正确数据类型。请参阅以下代码以获取示例:

types.FunctionType