C-API Unicode zu String

04/10/2011 - 13:52 von Thomas Guettler | Report spam
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
 

Lesen sie die antworten

#1 Stefan Behnel
04/10/2011 - 23:31 | Warnen spam
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

Ähnliche fragen