python - 如何让我的 Python 扩展接受额外的参数?

标签 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);
}

最佳答案

这是一个最小的例子:

#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);
}

关于python - 如何让我的 Python 扩展接受额外的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21480619/

相关文章:

python - numpy 读取带有复数的 .csv

C++ Pi 估计程序无法正常工作

c++ - 如何在 C++ 中生成中断处理程序的编译时数组?

c++ - TBB中的聚合节点

c++ - 头文件与源文件中的外部函数

python - 用于捕获两个子字符串之间的字符串的正则表达式

python - 在 pandas 数据帧上设置多重索引的最佳方法

python - 如何避免过多地使用 'self'

python - numpy 的快速傅里叶变换产生意想不到的结果

c++ - boost 图: Iterating through all vertices and printing adjacent vertices