Python C API логические объекты

Я использую Python C API 2.7.2 с моим консольным приложением C++. Существует одно сомнение в отношении булевых объектов Python C API

Я использую:

PyObject* myVariable = Py_True;

Нужно ли уважать myVariable с Py_DECREF(myVariable)?

Документация Python C API гласит:

Истинный объект Python. У этого объекта нет методов. Он должен рассматриваться как любой другой объект в отношении количества ссылок.

Я искал вопросы, но не мог найти четкого ответа на него.

Благодарю.

2 ответа

Решение

Он должен рассматриваться как любой другой объект в отношении количества ссылок.

Это означает, что вы должны увеличить его, когда берете ссылку

{
  Py_INCREF(Py_True);
  PyObject* myVariable = Py_True;

и вы должны определить это, когда избавляетесь от него.

  Py_DECREF(myVariable);
}

Хотя он не создается динамически, он должен быть подсчитан, поскольку переменные PyObject могут содержать ЛЮБОЙ объект Python. В противном случае потребуется проверка Py_True и других особых случаев, разбросанных по среде исполнения Python, а также любого кода C/C++, использующего API. Это было бы грязно и подвержено ошибкам.

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