Gdy odwołanie do obiektu jest przekazywane do lub z funkcji ze specyfikacji interfejsu funkcji wynika, czy własność jest przekazywana wraz z odwołaniem, czy też nie.
Większość funkcji zwracających odwołanie do obiektu przekazuje własność wraz z odwołaniem. W szczególności dotyczy to wszystkich funkcji których zadaniem jest utworzenie nowego obiektu, n.p. PyInt_FromLong() oraz Py_BuildValue() przekazują własność odwołania procedurze wywołującej. Własność do odwołania uzyskujemy nawet, gdy obiekt w rzeczywistości nie jest nowy. Na przykład funkcja PyInt_FromLong() wykorzystuje bufor używanych wartości i może zwrócić odwołanie do elementu z tego bufora.
Wiele funkcji wydobywających obiekty z innych obiektów również przekazuje własność odwołania, na przykład PyObject_GetAttrString(). Nie jest to już jednak tak oczywiste, ponieważ tutaj występuje kilka wyjątków: PyTuple_GetItem(), PyList_GetItem(), PyDict_GetItem() i PyDict_GetItemString() zwracają odwołania, które są pożyczone od krotki, listy lub słownika.
Funkcja PyImport_AddModule() równiez zwraca pożyczone
odwołanie, nawet pomimo, iż może w rzeczywistości tworzyć obiekt do
którego odwołanie jest przez nią zwracane: jest to możliwe, ponieważ
własność odwołania tworzonego przez tę funkcję jest przechowana w
sys.modules.
Gdy odwołanie do obiektu jest przekazywane do innej funkcji zwykle funkcja pożycza to odwołanie od procedury ją wywołującej -- gdy wystąpi potrzeba przechowania odwołania funkcja wykorzysta Py_INCREF() aby zostać niezależnym właścicielem odwołania. Istnieją dokładnie dwa wyjątki od tej reguły: PyTuple_SetItem() oraz PyList_SetItem(). Te funkcje przejmują własność nad przekazanym im odwołaniem -- nawet, gdy ich wywołanie zakończy się niepowodzeniem! (Należy zwrócić uwagę, iż PyDict_SetItem() oraz funkcje stowarzyszone nie przejmują własności -- zachowują się zgodnie z powyższą regułą)
Gdy funkcja w C jest wywoływana z Pythona, pożycza odwołanie do swoich argumentów od procedury wywołującej. Procedura wywołująca posiada odwołanie na własność, więc czas życia pożyczonych odwołań jest gwarantowany do czasu powrotu z funkcji. Tylko w przypadku konieczności przechowania lub przekazania pożyczonego odwołania należy funkcja musi nabyć własność do odwołania poprzez wywołanie Py_INCREF().
Odwołanie do obiektu zwracane z funkcji w C wywoływanej z Pythona musi być odwołaniem posiadanym -- własność jest przekazywana z funkcji do procedury wywołującej.
Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.