簡體   English   中英

將布爾值傳遞給Python C擴展的“正確”方法是什么?

[英]What is the “correct” way to pass a boolean to a Python C extension?

這是python文檔(http://docs.python.org/extending/extending.html)中的一個簡單示例:

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return Py_BuildValue("i", sts);
}

如果我想將另一個布爾參數傳遞給函數 - 這是什么“正確”的方法呢?

似乎沒有傳遞給PyArg_ParseTuple()的bool選項。 所以我想到了以下幾點:

  1. 讀取一個整數並只使用該值(因為bool是int的子類)
  2. 在整數上調用PyBool_FromLong()
  3. 讀取和對象並調用PyBool_Check()來驗證它是一個bool
  4. 也許有一種方法可以獲得任何類型的變量並獲得其真值(即空數組將是假數據等),這是python函數通常所做的。

這些中哪一個更好? 其他選擇?

4也許有一種方法可以獲得任何類型的變量並獲得其真值(即空數組將是假數據等),這是python函數通常所做的。

是的:(來自Python / C API參考

 int PyObject_IsTrue(PyObject *o) 

如果對象o被認為是真,則返回1,否則返回0。 這相當於Python表達式而不是o。 失敗時,返回-1。

編輯。 為了回答實際問題,我認為方法1是正確的,因為int實際上是C中的相應類型。方法4很好,但如果你將你的函數記錄為bool,你沒有義務接受任何對象。 在Python中,沒有理由的顯式類型檢查在3中是不受歡迎的。 像2中一樣轉換為另一個Python對象對您的C代碼沒有幫助。

目前,解析整數(作為"i" )是獲取bool的可接受方式。

根據Python 3.3, PyArg_ParseTuple將接受"p" (對於“謂詞”),根據最新消息

  • 問題#14705 :PyArg_Parse()系列函數現在支持'p'格式單元,它接受“布爾謂詞”參數。 它將任何Python值轉換為整數 - 如果為“false”則為0,否則為1。

注意,當使用帶有"p" PyArg_ParseTuple時,參數必須是(指向) int指針,而不是C99 bool類型:

int x;    // not "bool x"
PyArg_ParseTuple(args, kwds, "p", &x);

我找到了另一種方法:

PyObject* py_expectArgs;
bool expectArgs;

PyArg_ParseTupleAndKeywords(args, keywds, (char *)"O!", (char **)kwlist, &PyBool_Type, &py_expectArgs);

expectArgs = PyObject_IsTrue(py_expectArgs);

如果錯誤的參數調用有“自動”異常“參數1必須是bool,而不是int”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM