use*_*262 17 python python-c-api python-c-extension
我一直在努力学习如何为Python编写C扩展,并希望确定我理解PyArg_ParseTupleAndKeywords的工作原理.
我相信第一个参数是一个PyObject指针,它指向一个参数数组,这些参数按照它们传递的顺序传递给C-extension函数.第二个参数是传递的关键字列表,它们被传递的位置,以及非常可能的某种指示标记,告诉关键字开始和位置变得无关紧要.
然后,PyArg_ParseTupleAndKeywords使用其关键字列表(第四个参数)来映射用关键字指定的参数,以及格式字符串(第三个参数)和应该复制适当值的C变量(第五个和+参数)的地址.
我的理解是否正确?当我阅读在线文档时,我所看到的只是对"位置参数和关键字参数"的引用,这让我感到有些不知所措.处理PyArg_ParseTupleAndKeywords的Python解释器的文件在哪里?
Mat*_*sen 12
在python中模拟以下内容:
def keywords(a, b, foo=None, bar=None, baz=None):
pass
Run Code Online (Sandbox Code Playgroud)
以下将有效:
static PyObject *keywords(PyObject *self, PyObject *args, PyObject *kwargs)
{
char *a;
char *b;
char *foo = NULL;
char *bar = NULL;
char *baz = NULL;
// Note how "a" and "b" are included in this
// even though they aren't supposed to be in kwargs like in python
static char *kwlist[] = {"a", "b", "foo", "bar", "baz", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss|sss", kwlist,
&a, &b, &foo, &bar, &baz))
{
return NULL;
}
printf("a is %s\n", a);
printf("b is %s\n", b);
printf("foo is %s\n", foo);
printf("bar is %s\n", bar);
printf("baz is %s\n", baz);
Py_RETURN_NONE;
}
// ...
static PyMethodDef SpamMethods[] =
{
// ...
{"keywords", (PyCFunction) keywords, METH_VARARGS | METH_KEYWORDS, "practice kwargs"},
{NULL, NULL, 0, NULL}
// ...
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
from spam import keywords
keywords() # Fails, require a and b
keywords('a') # fails, requires b
keywords('a', 'b')
keywords('a', 'b', foo='foo', bar='bar', baz='baz')
keywords('a', 'b','foo', 'bar', 'baz')
keywords(a='a', b='b', foo='foo', bar='bar', baz='baz')
Run Code Online (Sandbox Code Playgroud)
您是否阅读了http://docs.python.org/c-api/arg.html上的开头解释?它很好地解释了正在发生的事情.不要特别参考PyArg_ParseTupleAndKeywords; 它假设你阅读上面的文字,并不是很有帮助.
不过你几乎得到了它.第一个参数确实是传入位置参数的列表.第二个是传入关键字参数的映射(将给定关键字名称映射到给定值).第四个参数实际上是您的函数准备接受的关键字列表.是的,第三个参数是格式字符串,第五个参数是后面的C指针,值被复制到其中.
你会发现PyArg_ParseTupleAndKeywords()下面Python/getargs.c.
| 归档时间: |
|
| 查看次数: |
6176 次 |
| 最近记录: |