【发布时间】:2013-10-23 17:58:53
【问题描述】:
我们正在编写一些 Python/C-API 代码,并且遇到了一个希望传递回调的方法。该方法将定期更新以反馈的形式发送到回调。事实证明,我们对定期反馈并不感兴趣。禁用该方法的默认反馈机制的唯一方法是向它传递某种回调。
我们采用的技术是声明一个只返回 None 的模块级函数,即:
static PyObject*
donothing(PyObject* self, PyObject* args) {
return Py_None;
}
当然,这个函数也需要在modules方法表中注册,即:
static PyMethodDef methods[] = {
{"donothing", donothing, METH_VARARGS, "do nothing"},
...
{NULL}
};
那么,当我们去调用该方法的时候,我们需要抓取该方法的一个引用,即:PyObject_GetAttrString(module_reference, "donothing").
所有这一切都感觉就像我们花了太多时间旋转我们的轮子,只是无所事事。然后它发生在我身上......嘿,似乎是 lambda x: None 的完美用途。但是在花了一个小时研究 Python/C-API 文档之后,我无法弄清楚如何创建 lambda。
我在http://docs.python.org/2/c-api/function.html 页面上看到了对闭包的引用,但我无法详细说明如何创建它们。
任何指针(或对 RTFM 的引用)将不胜感激。
【问题讨论】:
-
你能不能用
builtins.id来代替你自己的do-nothing函数? -
在这个链接(secnetix.de/olli/Python/lambda_functions.hawk)你可以找到更多的lambda例子。
-
使用 builtins.id() 的想法可以避免我们用愚蠢的 donothing() 方法污染我们的模块(这就是我投票赞成它的原因)......但我真的希望获得一些关于使用 Python/C-API 创建 lambda 的指示。
-
你为什么不使用类似的东西:
f = PyRun_String("lambda x: None", Py_single_input, globals, locals);。我猜函数对象的创建没有时间限制。从 C 语言评估 python 代码有时是最简单的解决方案(也是最易读的)。 -
这真是个好主意。我浏览了有关此方法的文档,发现 Py_CompileStringFlags()。这实际上可能是一种假设创建 CodeObjects 的方式,然后将它们关联为一种类型的任意属性。感谢您的提示!
标签: python python-c-api