python中getnum函数_python – 正确替换函数的代码对象

我试图获取函数的源代码,向其中添加代码,然后将其放回原始函数中.

基本上是这样的:

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,cpython,metaprogramming

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值