2013-10-23 45 views
4

我們正在研究一些Python/C-API代碼,並且遇到了想要傳遞迴調的方法。該方法將定期更新回調作爲反饋的形式。事實證明,我們對定期反饋並不感興趣。禁用方法的默認反饋機制的唯一方法是傳遞某種回調。如何從Python創建lambda/C

我們採用的技術是聲明一個模塊級的功能,只是返回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").

所有的這種感覺就像我們是SP結束太多的時間來旋轉我們的車輪,而無所作爲。然後,它發生在我身上,好像是一個完美的使用lambda x:無。但花了一個小時的Python/C-API文檔後,我無法弄清楚如何創建lambda表達式。

我看到有關頁面http://docs.python.org/2/c-api/function.html上的封閉的引用,但我無法理清如何創建它們的細節。

任何指針(或引用RTFM)將不勝感激。

+2

你可以使用'builtins.id'而不是調整你自己的無作用函數嗎? – SingleNegationElimination

+0

在此鏈接(http://www.secnetix.de/olli/Python/lambda_functions.hawk)中,您可以找到更多的lambda示例。 – randiel

+0

使用__builtins __。id()的想法可以節省我們用愚蠢的donothing()方法來污染我們的模塊(這就是爲什麼我將它投票推廣的原因)......但我真的希望有一些關於使用Python/C創建lambda的指針-API。 – user590028

回答

3

lambda表達式用於創建簡單的匿名函數。它們有一個PyFunction_Type包裝PyCode_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)這產生<built-in function 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); 
c->co_name = PyString_FromString("<c-lambda>"); // function name 
c->co_flags |= CO_VARARGS; // accept *args 
c->co_nlocals = 1; // needed in Python 3 
l = PyFunction_New((PyObject *) c, PyEval_GetGlobals()); 

在這兩種情況下,你會得到與dissasembled代碼dis(l)相當於一個功能到lambda

1   0 LOAD_CONST    0 (None) 
       3 RETURN_VALUE   
+1

這是一篇很棒的文章 - 感謝您的洞察力。 – user590028