我将扩展类型对象传递给 Python 函数,该函数需要将这种类型的变量传递给 C 函数。我的扩展类型如下所示:
typedef struct {
    PyObject_HEAD
    rec_rset_t rst;  //need to pass this to C function
} RSet;
rec_rset_t 是指向结构的指针,如下所示:
typedef struct rec_rset_s *rec_rset_t;
其中 rec_rset_s 是这样定义的:
struct rec_rset_s
{
  size_t size; 
  int a,b;
}
所以我有一个 Python 扩展函数,它接收一个 RSet 对象作为参数。
static PyObject*
Recon_query(Recon *self, PyObject *args, PyObject *kwds)
{
    const char  *type;
    RSet        *tmp = PyObject_NEW(RSet, &RSetType);
    rec_rset_t  res;
    static char *kwlist[] = {"type", "rset", NULL};
    if (! PyArg_ParseTupleAndKeywords(args, kwds, "zO", kwlist,
                                      &type, &rset))
      { 
        return NULL;
      }
    res = cquery(self->rcn, type, rset->rst);
    tmp->rst = res;
    return Py_BuildValue("O",tmp);
}
问题是我希望能够传递对象,并将其转换None为RSetC 中的 NULL 以及变量rst为 NULL。如果我通过None,我会遇到分段错误,因为"O"选项  PyArg_ParseTupleAndKeywords不处理 None 值PyObject(这与选项不同,如果我们传递字符串"s",我们可以使用该选项)。我尝试手动检查对象,但没有奏效。所以目前我正在做一些不太优雅的事情,就像这样:"z"NULLPy_None
if(rset->rst == 0x89e8a0)
    rset->rst = NULL;
因为那是rset->rst我传递时的值None,然后将其传递rset->rst给cquery函数。接收扩展类型对象时如何传递None值?PyArg_ParseTuple有没有一种通用的方法可以做到这一点?
编辑:
我错误地检查了 Py_None 的 rset->rst 的值。检查
if((PyObject *)rset == Py_None)
评估为真,所以是的,没有处理。但是值 rset->rst(我传递给 cquery)不是 NULL,这正是我想要的。手动设置 rset->rst = NULL 是唯一的方法吗?