Правильно ли указывается следующее:
-
Если объект Python создается в C-функции, но функция не возвращает его, не требуется
INCREF
, но <DECREF
. -
[false] Если функция возвращает его, вам нужно
INCREF
в функции, которая получает возвращаемое значение. [/false] -
При назначении C типизированных переменных в качестве атрибутов, таких как
double
,int
и т.д., для объекта Python, не требуетсяINCREF
илиDECREF
. -
Назначение объектов Python в качестве атрибутов для других объектов Python выглядит следующим образом:
PyObject *foo; foo = bar // A Python object tmp = self->foo; Py_INCREF(foo); self->foo = foo; Py_XDECREF(tmp); //taken from the manual, but it is unclear if this works in every situation
EDIT: → Можно ли безопасно использовать это в любой ситуации? (не сталкивались с ситуацией, когда это вызывало у меня проблемы)
- Dealloc объекта Python должен
DECREF
для каждого другого объекта Python, который он имеет в качестве атрибута, но не для атрибутов типа C.
Edit
С "C-типом как атрибутом" я имею в виду bar и baz:
typedef struct {
PyObject_HEAD
PyObject *foo;
int bar;
double baz;
} FooBarBaz;