我正在与一个返回不透明指针的库进行交互。子类 c_void_p 在 ctypes 中表示这一点并为 c_void_p 的这种特殊风格提供类型检查是否可以接受?
执行此类型检查的一个简单方法可能是创建一些任意的
ctypes.Structure
class _Opaque(ctypes.Structure):
pass
声明相关函数的返回类型为指向该结构体的指针
lib.f.restype = ctypes.POINTER(_Opaque)
以及再次接受这种指针的函数的参数类型:
lib.g.argtypes = [ctypes.POINTER(_Opaque)]
现在,
ctypes
确保g
的参数是之前由f
返回的指针。 (请注意,我使用前导 _
来标记 _Opaque
,仅用于本模块。)
与 Sven 发布的想法相同,但界面更充实:
def OPAQUE_POINTER(name = 'opaque'):
class cls(Structure):
pass
cls.__name__ = name
ptr = POINTER(cls)
return ptr
# Use like this
my_type = OPAQUE_POINTER('my_type')