[ctypes] BCP: wie Funktionen deklarieren, die Pointer auf Objekt zurückgeben?

27/09/2008 - 04:07 von Thomas Rachel | Report spam
Hallo,

wie deklariere ich unter ctypes am schönsten eine Funktion, die einen
Pointer auf ein Objekt zurückgibt und NULL bei Fehler?

Als nettes Zusatzfeature stelle ich mir vor, daß sie eine Exception
wirft, wenn NULL hàtte kommen sollen. (Oder sollte man das besser dem
Wrapper überlassen?)


Angenommen, ich habe

engine * engOpen(char * host);

. Dann kann ich ja wie folgt vorgehen:


from ctypes import *
eng=<dies sei das DLL-Objekt>

class NPE(ValueError): pass

def raiseifNone(value):
if not value: raise NPE
return value

class Engine(Structure):
pass

engOpen1ÏUNCTYPE(c_void_p,c_char_p)(('engOpen',eng),((1,'name',''),))
engOpen1.errcheck=lambda result, func, args: \
Engine.from_address(raiseifNone(result))

engOpen1 bietet mir alles, was ich brauche, und liefert mir zudem ein
Engine-Objekt zurück. Gefàllt mir, kommt mir aber umstàndlich vor.


engOpen2ÏUNCTYPE(POINTER(Engine),c_char_p)(('engOpen',eng),((1,'name',''),))
engOpen2.errcheck=lambda result, func, args: result.contents

engOpen2 wirft mir einen ValueError, wenn NULL zurückkommt, und gibt mir
ansonsten ein Engine-Objekt zurück. Schöner wàre es, wenn der Zugriff
auf result.contents nicht direkt ValueError werfen würde, sondern erst
der Zugriff dort drauf bzw. auch addressof(result.contents) möglich
wàre, womit ich NULL abfangen könnte.


Welcher dieser beiden Möglichkeiten ist zu bevorzugen? Oder bin ich auf
dem Holzweg und man macht es ganz anders?

Generell: Gibt es irgendwo ein Projekt, das man sich als Vorbild nehmen
könnte? Das im letzten Thread erwàhnte ldap-Projekt ist ja noch in C
geschrieben, oder?


TIA,


Thomas
 

Lesen sie die antworten

#1 Marek Kubica
27/09/2008 - 19:42 | Warnen spam
On Sat, 27 Sep 2008 04:07:45 +0200, Thomas Rachel wrote:

Generell: Gibt es irgendwo ein Projekt, das man sich als Vorbild nehmen
könnte? Das im letzten Thread erwàhnte ldap-Projekt ist ja noch in C
geschrieben, oder?



Ich weiß nicht ob als Vorbild, aber du kannst dir ja mal mat-tre ansehen
<http://www.bitbucket.org/leonidas/tre/>, ein ctypes-Binding an TRE.
Alternativ auch PyOpenGL, welches soweit ich weiß nun auf ctypes
umgestellt hat.

grüße,
Marek

Ähnliche fragen