如何使我的Python扩展获取其他参数?

时间:2014-01-31 12:56:11

标签: python c++

请考虑以下我从Python文档页面获取的示例代码。现在需要一个论点。我想让它接受像“mode = 2”这样的命名参数。所以我可以调用myext.do_something('/ home / crypto / something.jpg',mode = 2)。使用mode传递的参数应该是一个整数,如果它得到其他东西,我希望它在Python中引发错误。我该怎么做呢?我想我应该编辑module_functions [],但我不知道该放什么。

#include <Python.h>

static PyObject * 
do_something(PyObject *self, PyObject *args)
{
   char *filename;
   if (!PyArg_ParseTuple(args, "s", &filename))
      return NULL;

   char *result = do_somethingelse(filename);
   return Py_BuildValue("s", result);
}

static PyMethodDef
module_functions[] = {
    { "do_something", do_something, METH_VARARGS, "do something" },
    { NULL }
};


PyMODINIT_FUNC
initmyext(void)
{
    Py_InitModule("myext", module_functions);
}

1 个答案:

答案 0 :(得分:1)

这是一个最小的例子:

#include <Python.h>

static PyObject * 
do_something(PyObject *self, PyObject *args, PyObject *kwargs)
{
   char *filename;
   int mode = 2;
   static char *keywords[] = {"filename", "mode", NULL};

   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", keywords, &filename, &mode))
      return NULL;

   char *result = do_somethingelse(filename);
   return Py_BuildValue("s", result);
}

static PyMethodDef
module_functions[] = {
    { "do_something", (PyCFunction)do_something, METH_VARARGS | METH_KEYWORDS, "do something" },
    { NULL }
};


PyMODINIT_FUNC
initmyext(void)
{
    Py_InitModule("myext", module_functions);
}