PyArg_ParseTupleAndKeywords如何工作?

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)

  • 在`setup.py`上设置`language =“ c ++”`并用`-std = c ++ 11`构建它会发出警告信息:ISO C ++禁止将字符串常量转换为'char *'[-Wwrite-strings ]`代表`static char * kwlist [] = {“”,“”,NULL};` (2认同)

the*_*aul 8

您是否阅读了http://docs.python.org/c-api/arg.html上的开头解释?它很好地解释了正在发生的事情.不要特别参考PyArg_ParseTupleAndKeywords; 它假设你阅读上面的文字,并不是很有帮助.

不过你几乎得到了它.第一个参数确实是传入位置参数的列表.第二个是传入关键字参数的映射(将给定关键字名称映射到给定值).第四个参数实际上是您的函数准备接受的关键字列表.是的,第三个参数是格式字符串,第五个参数是后面的C指针,值被复制到其中.

你会发现PyArg_ParseTupleAndKeywords()下面Python/getargs.c.

  • 不仅仅是 C API 文档,http://docs.python.org/2/extending/extending.html 上有一个很好的可读摘要 (2认同)