количество ссылок в расширении Python C

Я пишу свое первое расширение C для Python и не понимаю, сколько ссылок у меня. Вот что я пытаюсь сделать.

Я заполняю dict в цикле for:

mydict = PyDict_New();

for (...)
{
    pair = PyTuple_Pack(2, PyString_FromString("some string"),
          PyString_FromString("some other string"));

    /* at this point, the refcnt for the tuple is 1, the refcnts for the
       2 string items are 2. Because according to the source, PyString_FromString
       does an INCREF, and PyTuple_Pack() does an INCREF on its items
     */

    PyDict_SetItem(mydict, PyString_FromString("some key"), pair);

    /* At this point, the key's refcnt is 2.  PyString_FromString sets it to 1 and 
       PyDict_SetItem INCREF's it. Ditto for pair since PyDict_SetItem also INCREF's
       the value.
     */

    Py_DECREF(pair);

    /* pair's refcnt is 1 which makes sense to me since mydict now owns the tuple, 
       but the refcnt for its items are still at 2.  I don't understand this part.
     */
}

return mydict;

Правильно ли подсчитано количество ссылок? В документации C API специально рекомендуется использовать PyObject_FromXXX функции как аргументы для PyTuple_SetItem или PyList_SetItem , потому что они «крадут» ссылки.

Не задокументировано, крадет ли PyDict_SetItem ссылки. Я предполагаю, что это не так, и в этом случае Я должен сделать

first = PyString_FromString("some string");
second = PyString_FromString("some other string");
pair = PyTuple_Pack(2, first, second);
Py_DECREF(second);
Py_DECREF(first);

Я прав?

11
задан lig 16 December 2011 в 07:08
поделиться