Hallo, in einer in C geschriebenen Extension habe ich das Behandeln von Unicode hinzugefügt. Bisher war "str" immer ein byte-String, also nicht Unicode. PyUnicode_AsUTF8String() gibt eine neue Referenz zurück. Muss ich noch für das reference counting incr/decr ausführen, oder reicht das so? void foo(PyObject *str) { // start neu if (PyUnicode_Check(str)) { str=PyUnicode_AsUTF8String(str); } // end neu rc = some_c_method(PyString_AsString(str), PyString_Size(str), ...); // str wird nicht weiter verwendet. return ... } Gruß, Thomas -- Thomas Guettler, http://www.thomas-guettler.de/ E-Mail: guettli (*) thomas-guettler + de
Thomas Guettler, 04.10.2011 13:52:
in einer in C geschriebenen Extension habe ich das Behandeln von Unicode hinzugefügt.
Bisher war "str" immer ein byte-String, also nicht Unicode.
PyUnicode_AsUTF8String() gibt eine neue Referenz zurück. Muss ich noch für das reference counting incr/decr ausführen, oder reicht das so?
void foo(PyObject *str) { // start neu if (PyUnicode_Check(str)) { str=PyUnicode_AsUTF8String(str);
Ganz schlechter Stil. Das Problem ist, dass die Funktion die Referenz auf str eigentlich nicht "besitzt" (die gehört dem Aufrufer), aber hier eine neue Referenz zuweist, die nur sie selbst besitzt. Das macht es schwer, im weiteren Verlauf die Referenzen auseinander zu halten. Nur im zweiten Fall brauchst du nämlich am Ende ein DECREF. Lösung: verwende zwei verschiedene Variablen. Noch ein Tipp: schau dir Cython an. Damit vermeidest du die meisten Refcounting-Probleme von Haus aus. Stefan
participants (2)
-
Stefan Behnel
-
Thomas Guettler