У меня есть такой код:

    PyObject *callback;
    PyObject *paths;

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

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

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

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

5
Paul 20 Авг 2010 в 19:37

2 ответа

Лучший ответ

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

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

1
John Machin 22 Авг 2010 в 12:00

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

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

0
Xavier Combelle 22 Авг 2010 в 10:59