gpt4 book ai didi

python - SystemError : Objects/cellobject. c:24:内部函数的参数错误

转载 作者:行者123 更新时间:2023-11-30 17:32:20 26 4
gpt4 key购买 nike

我正在使用 ctypes 来处理用 C 编写的库。这个 C 库允许我注册回调函数,我正在 Python 中实现该函数。

根据 ctypes API,这是回调函数类型:

_command_callback = CFUNCTYPE(
UNCHECKED(c_int),
POINTER(vedis_context),
c_int,
POINTER(POINTER(vedis_value)))

这是我编写的一个装饰器,用于将函数标记为回调:

def wrap_callback(fn):
return _command_callback(fn)

要使用它,我可以简单地编写:

@wrap_callback
def my_callback(*args):
print args
return 1 # Needed by C library to indicate OK response.

c_library_func.register_callback(my_callback)

我现在可以从 C 调用我的回调 (my_callback),并且效果非常好

我遇到的问题是,我希望在这些回调中执行一些样板行为(例如返回成功标志等)。为了尽量减少样板代码,我尝试编写一个装饰器:

def wrap_callback(fn):
def inner(*args, **kwargs):
return fn(*args, **kwargs)
return _command_callback(inner)

请注意,这在功能上与前面的示例相同。

@wrap_callback
def my_callback(*args):
print args
return 1

但是,当我尝试使用此方法调用回调时,我收到以下异常,源自 _ctypes/callbacks.c:

Traceback (most recent call last):
File "_ctypes/callbacks.c", line 314, in 'calling callback function'
File "/home/charles/tmp/scrap/z1/src/vedis/vedis/core.py", line 28, in inner
return fn(*args, **kwargs)
SystemError: Objects/cellobject.c:24: bad argument to internal function

我不确定这里发生了什么会导致第一个示例正常工作但第二个示例失败。有人能解释一下吗?如果您能帮助我找到一种装饰这些回调的方法,这样我就可以减少样板代码,那就加分了!

最佳答案

感谢 eryksyn,我能够解决这个问题。修复如下:

def wrap_callback(fn):
def inner(*args, **kwargs):
return fn(*args, **kwargs)
return _command_callback(inner), inner

def my_callback(*args):
print args
return 1

ctypes_cb, my_callback = wrap_callback(my_callback)

关于python - SystemError : Objects/cellobject. c:24:内部函数的参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com