Требуется ли PyBuffer_Release после Py_BuildValue("y#", ...)?

Если это имеет значение, меня интересует ответ относительно Python 3.

Документы заявляют ( здесь и здесь), что PyBuffer_Release() должен быть вызван после PyArg_Parse*() с s*, y*,

Ничего подобного не написано о Py_BuildValue(), Это оплошность, или в случае Py_BuildValue() simple Py_DECREF() достаточно?

Вот мой конкретный случай:

uint8_t buf = (uint8_t *)malloc(bufSize);
PyObject *pyBuf = Py_BuildValue("y#", (char *)buf, bufSize);
free(buf);

// do something with pyBuf

// maybe a PyBuffer_Release(get_underlying_buffer(pyBuf)) here?
Py_DECREF(pyBuf);

1 ответ

Решение

Я думаю нет:

  1. В обоих PyArg_Parse* а также Py_BuildValue функции, y# относится к строке и длине, а не к буферу, и, следовательно, нет базового объекта буфера для освобождения.

  2. Документация для Py_BuildValue говорит:

    Когда буферы памяти передаются в качестве параметров для предоставления данных для построения объектов, как для форматов s и s #, необходимые данные копируются. На буферы, предоставляемые вызывающей стороной, никогда не ссылаются объекты, созданные Py_BuildValue().

    Цель удержания блокировки на буфере, используемом PyArg_Parse* в том, что у вас есть ссылка на некоторые данные из Python в C, и вы хотите обработать их в C без каких-либо шансов их изменения в Python. В этом случае вы скопировали некоторые данные из C в Python, поэтому нет необходимости защищать исходные данные от модификации.

Другие вопросы по тегам