将 ctypes.POINTER(instance) 变成实际实例?
Turning ctypes.POINTER(instance) into an actual instance?
我有以下 ctypes
函数,它接受一个文件名和 return 一个指向 Image 实例的指针:
class Image(ctypes.Structure):
_fields_ = (
('image_info', ImageInfo),
('type', ctypes.c_int),
('format', ctypes.POINTER(Format) ),
)
my_image_open = _lib.my_image_open
my_image_open.argtypes = [ ctypes.c_char_p ]
my_image_open.restype = ctypes.POINTER(Image)
我想提供一些语法糖并在 Image 构造函数中包装 my_image_open
。但是我不能简单地将 returned 指针绑定到 self
:
class Image(ctypes.Structure):
def __init__( self, filename ):
img = my_image_open( filename )
self = img[0] # does not work, since self is local !
做上面的事情有意义吗,或者我应该简单地使用一个独立的函数 returning 一个实例:
c_image_open = _lib.my_image_open
c_image_open.argtypes = [ ctypes.c_char_p ]
c_image_open.restype = ctypes.POINTER(Image)
# syntactic sugar:
def my_image_open( filename ):
img = c_image_open( filename )
return img[0]
所以我最终遵循了@eryksun 的建议:
class Image(ctypes.Structure):
_fields_ = (
('image_info', ImageInfo),
('type', ctypes.c_int),
('format', ctypes.POINTER(Format) ),
)
@classmethod
def open(cls,filename):
img = my_image_open( filename )
if img: return img[0]
return None
我有以下 ctypes
函数,它接受一个文件名和 return 一个指向 Image 实例的指针:
class Image(ctypes.Structure):
_fields_ = (
('image_info', ImageInfo),
('type', ctypes.c_int),
('format', ctypes.POINTER(Format) ),
)
my_image_open = _lib.my_image_open
my_image_open.argtypes = [ ctypes.c_char_p ]
my_image_open.restype = ctypes.POINTER(Image)
我想提供一些语法糖并在 Image 构造函数中包装 my_image_open
。但是我不能简单地将 returned 指针绑定到 self
:
class Image(ctypes.Structure):
def __init__( self, filename ):
img = my_image_open( filename )
self = img[0] # does not work, since self is local !
做上面的事情有意义吗,或者我应该简单地使用一个独立的函数 returning 一个实例:
c_image_open = _lib.my_image_open
c_image_open.argtypes = [ ctypes.c_char_p ]
c_image_open.restype = ctypes.POINTER(Image)
# syntactic sugar:
def my_image_open( filename ):
img = c_image_open( filename )
return img[0]
所以我最终遵循了@eryksun 的建议:
class Image(ctypes.Structure):
_fields_ = (
('image_info', ImageInfo),
('type', ctypes.c_int),
('format', ctypes.POINTER(Format) ),
)
@classmethod
def open(cls,filename):
img = my_image_open( filename )
if img: return img[0]
return None