这是错误.
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
File "USB2.py", line 454, in ff
self.drv_locked = False
SystemError: Objects/cellobject.c:24: bad argument to internal function
Run Code Online (Sandbox Code Playgroud)
这是涉及的Python代码.
def drv_send(self, data, size):
if not self.Connected():
return
def f():
self.drv_locked = True
buffer = ''.join(chr(c) for c in data[:size])
out_buffer = cast(buffer, POINTER(c_uint8))
request_handle = (OPENUSB_REQUEST_HANDLE * 1)()
request = (OPENUSB_INTR_REQUEST * 1)()
request_handle[0].dev = self.usbhandle
request_handle[0].interface = INTERFACE_ID
request_handle[0].endpoint = LIBUSB_ENDPOINT_OUT + 1
request_handle[0].type = USB_TYPE_INTERRUPT
request_handle[0].req.intr = request
def f(req):
print req[0].req.intr[0].result.status, req[0].req.intr[0].result.transferred_bytes
self.drv_locked = False # Line 454
request_handle[0].cb = REQUEST_CALLBACK(f)
request_handle[0].arg = None
request[0].payload = out_buffer
request[0].length = size
request[0].timeout = 5000
request[0].flags = 0
request[0].next = None
r = lib.openusb_xfer_aio(request_handle)
print "result", r
self.command_queue.put(f)
Run Code Online (Sandbox Code Playgroud)
这是涉及的Python源代码.
PyObject *
PyCell_Get(PyObject *op)
{
if (!PyCell_Check(op)) {
PyErr_BadInternalCall(); // Line 24
return NULL;
}
Py_XINCREF(((PyCellObject*)op)->ob_ref);
return PyCell_GET(op);
}
Run Code Online (Sandbox Code Playgroud)
内部错误显然是Python本身的一个错误,如果您有兴趣进一步探索这个并为Python内核提供修复,那么将代码简化到仍然触发错误的地方将是正确的策略.
如果您对代码更有兴趣,而不是修复Python内核,那么我建议您避免代码中的一些异常,这些异常可能会导致混淆Python.例如,我不知道有人曾经想过为一个嵌套函数测试属性,这个嵌套函数名为f包含另一个也被命名的进一步嵌套函数f- 它应该可以工作,但它确实是那种可能没有经过良好测试的东西因为没有人想到它,虽然故意挑起这样的异常是加强一系列测试的一个非常好的策略,但如果你不是故意要在Python的内部触发错误,最好避免.
所以,首先,我要确保周围没有同性恋.如果仍然存在错误,我接下来会通过将当前对非本地变量的访问权限转换为"预绑定参数"来删除单元格对象的使用,例如,您的"半外部" f可能会更改为:
def f(self=self):
而你的"完全内在的"可能成为:
def g(req, self=self):
这将使self这些函数(当前非局部变量访问)中的任何一个访问到本地变量访问.是的,你不应该这样做(任何软件都应该没有错误,这需要你解决它们),但唉完美并不是这个子世界的特征,因此学习错误解决方案策略是不可避免的生活的一部分;-).
| 归档时间: |
|
| 查看次数: |
2728 次 |
| 最近记录: |