【发布时间】:2017-12-15 15:57:34
【问题描述】:
我有一个函数在我包装的标题中
IMPORT_FUNCTION int WINAPI GetStuff(int id, StuffStruct* stuff, StuffList *stuffList=NULL);
我用
包装了这个函数mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct), POINTER(StuffList)]
也试过跳过
mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct)]
我需要在不指定最后一个参数的情况下调用此函数。我试过 None 并创建一个像这样 POINTER(StuffList)() 的空指针 我觉得我应该使用原型,但我现在不知道。
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
【问题讨论】:
-
mydll.GetStuff(2, byref(stuff), byref(None)) 怎么样
-
这个原型在我看来就像 C++。 C 不支持具有默认值的可选参数。在 C 语言中,如果
NULL,您可以有一个将被忽略的指针参数,在这种情况下,通过 ctypes 将其作为None传递。但如果这真的是一个没有明确定义的 C API 的 C++ 库,那么最好使用 cython 或 CFFI。 -
@eryksun 你说得对,它是 C++ lib,但我想除了这一刻之外,还有定义明确的 C API。这个默认值适用于整数,因为我可以很好地传递 0。但NULL指针不是。