PyArg_ParseTuple и указатель на функцию обратного вызова - PullRequest
5 голосов
/ 20 августа 2010

У меня есть код, подобный следующему:

    PyObject *callback;
    PyObject *paths;

    // Process and convert arguments
    if (!PyArg_ParseTuple(args, "OO:schedule", &paths, &callback))
            return NULL;

Что именно происходит внутри PyArg_ParseTuple?Я предполагаю, что обратный вызов получает указатель функции, который я передал аргументам (также PyObject *).Как PyArg_ParseTuple преобразует указатель функции в PyObject *?

Что я хочу знать, так это то, что произойдет, если я передам один и тот же указатель функции обратного вызова дважды.Я думаю, что обратному вызову выделяется новый PyObject внутри PyArg_ParseTuple, поэтому он будет каждый раз получать новый адрес памяти, но будет содержать один и тот же указатель функции обратного вызова.

Но если я сделаю обратный вызов PyObject_Hash, он будет выдавать другое значениевремя, верно?(так как адрес каждый раз отличается ..)

Ответы [ 2 ]

1 голос
/ 22 августа 2010

PyArg_ParseTuple не заботится о типе "O" arg. Преобразование не выполняется. Новый объект не создан. Адрес объекта сбрасывается в указанную вами переменную PyObject * C. Он делает то же самое с каждым из ваших двух аргументов.

Я не могу представить, какова актуальность PyObject_Hash. Если вы хотите сравнить два воплощения вашего аргумента обратного вызова, просто используйте == в адресах.

0 голосов
/ 20 августа 2010

Дело в том, что если вы дважды передадите один и тот же обратный вызов, он получит два объекта, но вам никогда не будет позволено прочитать только один, написанный Ласом. У вас будет какая-то утечка памяти, так как на один из двух указателей не будут ссылаться. Конечно, сборщик мусора в конечном итоге пройдет за вами, чтобы убрать весь беспорядок. Но все равно ...

Я неправильно прочитал, что PyObject_Hash должен вызываться при обратном вызове и путях. Будет так же. но вы, вероятно, хотите сравнить обратный вызов и пути: if (callback == пути) {printf ("это тот же callabck");}

...