如何从Python / C创建lambda
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何从Python / C创建lambda,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2243字,纯文字阅读大概需要4分钟。
内容图文
![如何从Python / C创建lambda](/upload/InfoBanner/zyjiaocheng/786/718429e2000642358eef5aa359aa810e.jpg)
我们正在研究一些Python / C-API代码,我们遇到了一个希望传递回调的方法.该方法将作为反馈的形式定期更新回调.事实证明,我们对定期反馈并不感兴趣.禁用方法的默认反馈机制的唯一方法是传递某种回调.
我们采用的技术是声明一个只返回None的模块级函数,即:
static PyObject*
donothing(PyObject* self, PyObject* args) {
return Py_None;
}
但是当然,这个函数也需要在模块方法表中注册,即:
static PyMethodDef methods[] = {
{"donothing", donothing, METH_VARARGS, "do nothing"},
...
{NULL}
};
然后,当我们去调用方法时,我们需要获取对此方法的引用,即:PyObject_GetAttrString(module_reference,“donothing”).
所有这些感觉就像我们花太多时间旋转我们的车轮而无所事事.然后它发生在我身上……嘿,似乎是lambda x的完美用法:无.但是在花了一个小时使用Python / C-API文档后,我无法弄清楚如何创建lambda.
我看到页面http://docs.python.org/2/c-api/function.html上有对闭包的引用,但我无法理清有关如何创建它们的详细信息.
任何指针(或对RTFM的引用)都将非常感激.
解决方法:
lambda表达式用于创建简单的匿名函数.它们有一个包含PyCode_Type对象的PyFunction_Type,它是一块可执行代码.但是你已经在C方面,所以创建一个Python函数会有点太多.相反,你应该创建一个PyCFunction_Type对象.这类似于您尝试使用模块方法的操作.
C中的样板也不会太大,但只有几行:
static PyObject *
donothing(PyObject *self, PyObject *args) {
Py_RETURN_NONE;
}
static PyMethodDef donothing_ml = {"donothing", donothing, METH_VARARGS, "doc"};
然后使用PyCFunction_New(& donothing_ml,NULL)创建对象,这产生<内置函数donothing>.此函数独立于您的模块,可以像任何其他PyObject一样使用.
它不是一个高级lambda,而是lambda * args的低级实现:None.
但是,如果您真的想要创建一个高级lambda,可以使用像dastrobu提出的单个语句来完成此操作
l = PyRun_String("lambda *args: None", Py_eval_input, PyEval_GetGlobals(), NULL);
或者如果您想自己组装它,您可以做到
PyCodeObject *c = (PyCodeObject *) Py_CompileString("None", "fn", Py_eval_input);
#if PY_MAJOR_VERSION >= 3
c->co_name = PyUnicode_FromString("<c-lambda>"); // function name
#else
c->co_name = PyString_FromString("<c-lambda>"); // function name
#endif
c->co_flags |= CO_VARARGS; // accept *args
c->co_nlocals = 1; // needed in Python 3
l = PyFunction_New((PyObject *) c, PyEval_GetGlobals());
在这两种情况下,你都会得到一个函数,其中包含与lambda相当的disasmbled代码dis(l):
1 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
内容总结
以上是互联网集市为您收集整理的如何从Python / C创建lambda全部内容,希望文章能够帮你解决如何从Python / C创建lambda所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。