2017-12-15 9 views
2

Ich habe eine Funktion in der im HeaderPython ctypes wie kann man optionale Argumente überspringen

IMPORT_FUNCTION int WINAPI GetStuff(int id, StuffStruct* stuff, StuffList *stuffList=NULL); 

Im Verpackung diese Funktion mit

mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct), POINTER(StuffList)] 

Einwickeln auch versucht

mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct)] 

ich Skipping muss diese Funktion aufrufen, ohne den letzten Parameter anzugeben. Ich habe versucht, None und erstellen einen Null-Zeiger wie diese POINTER (StuffList)() Ich fühle mich wie ich sollte Prototyp, aber ich weiß es nicht an dieser Stelle.

stuff = StuffStruct() 
np = POINTER(StuffList)() 
mydll.GetStuff(2, byref(stuff), None) # tried this 
mydll.GetStuff(2, byref(stuff), np) # tried this 
mydll.GetStuff(2, byref(stuff)) # tried this 
+0

Wie wäre es mydll.GetStuff (2, byref (Material), byref (None)) – Gary02127

+1

Das Prototyp sieht aus wie C++ zu mir. C unterstützt keine optionalen Argumente mit Standardwerten. In C können Sie ein Zeigerargument haben, das ignoriert wird, wenn 'NULL', in diesem Fall übergeben Sie es als 'None' über Ctypes. Aber wenn dies wirklich eine C++ - Bibliothek ohne eine gut definierte C-API ist, dann ist es besser, Cython oder CFFI zu verwenden. – eryksun

+0

@eryksun Sie haben Recht, es ist C++ lib, aber mit gut definierten C API ich denke, außer für diesen Moment. Diese Standardwerte funktionieren gut mit Ganzzahlen, da ich 0 gut übergeben kann. Aber NULL-Zeiger ist nicht. – user1750501

Antwort

0

Versuchen:

mydll.GetStuff(2, byref(stuff), byref(0)) 

und

mydll.GetStuff(2, byref(stuff), byref(None)) 

oder

np = POINTER([]) 
0

None ist das Äquivalent von NULL in Python. Deklarieren Sie argtypes für alle drei Parameter. Im Folgenden ist richtig:

mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct), POINTER(StuffList)]  

stuff = StuffStruct() 
mydll.GetStuff(2, byref(stuff), None) 

ctypes nicht über optionale Argumente wissen Sie, so dass Sie etwas passieren müssen. Man könnte immer wickeln die ctypes in einer Python-Funktion aufrufen und dann rufen:

def GetStuff(id,stuff,stuffList=None): 
    mydll.GetStuff(id,stuff,stuffList) 
Verwandte Themen