【发布时间】:2019-02-09 01:26:57
【问题描述】:
我正在尝试获取函数的源代码,向其中添加代码,然后将其放回原始函数中。
基本上是这样的:
new_code = change_code(original_code)
throwaway_module = ModuleType('m')
exec(new_code, throwaway_module.__dict__)
func.__code__ = getattr(throwaway_module, func.__name__).__code__
当new_code 不包含任何不在原始函数中的名称时,这非常有效。
但是,当 new_code 包含原始 func 中不存在的变量名称时,在最后一行我收到以下错误:
ValueError: func() requires a code object with 1 free vars, not 0
有什么想法吗?
编辑:
似乎我已经找到了在 CPython 源代码中引发此异常的位置(文件 funcobject.c)。为清楚起见,省略了一些行:
static int
func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
{
Py_ssize_t nfree, nclosure;
// ... lines omitted
nfree = PyCode_GetNumFree((PyCodeObject *)value);
nclosure = (op->func_closure == NULL ? 0 :
PyTuple_GET_SIZE(op->func_closure));
if (nclosure != nfree) {
PyErr_Format(PyExc_ValueError,
"%U() requires a code object with %zd free vars,"
" not %zd",
op->func_name,
nclosure, nfree);
return -1;
}
Py_INCREF(value);
Py_XSETREF(op->func_code, value);
return 0;
}
这对你有帮助吗? :)
【问题讨论】:
标签: python metaprogramming cpython