Cosa ne pensi di questo errore Python?
Domanda
Ecco l'errore.
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
Ecco il codice Python coinvolto.
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)
Ed ecco la sorgente Python coinvolti.
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);
}
Soluzione
Un errore interno è chiaramente un bug in Python per sé, e se siete interessati a esplorare ulteriormente questo e offrendo una correzione per il nucleo Python, quindi semplificando il codice fino a dove si innesca ancora il bug sarebbe la strategia giusta .
Se siete più interessati ad avere il vostro lavoro di codice, piuttosto che nel fissare il nucleo di Python, allora ti suggerisco di evitare alcune delle diverse anomalie nel codice che potrebbero contribuire a confondere Python. Per esempio, non so che nessuno ha mai pensato di testare proprietà per una funzione nidificata denominata f
contenente un'altra funzione ulteriormente-nested anche f
chiamato - dovrebbe funzionare, ma è esattamente il tipo di cosa che non avrebbe potuto essere ben testato solo perché nessuno pensava di esso ancora, e mentre deliberatamente provocando tali anomalie è una buona strategia per rafforzando una suite di test, potrebbe essere meglio evitare se non siete deliberatamente per innescare i bug in interni di Python.
Quindi, in primo luogo, vorrei fare in modo non c'è omonimia intorno. Se che lascia ancora il bug, vorrei prossima rimuovere l'uso di oggetti di cellule da trasformando quello che attualmente sono gli accessi alle variabili non locali in "argomenti prebound", per esempio il vostro f
"semi-esterno" potrebbe essere cambiamenti per cominciare:
def f(self=self):
e la tua "uno completamente interno" potrebbe diventare:
def g(req, self=self):
Questo renderebbe accessi self
in una di quelle funzioni (attualmente variabile non locale accede a) nella variabile locale accessi. Sì, non si dovrebbero avere per fare questo (non ci dovrebbero essere problemi di qualsiasi software, che richiede di lavorare intorno a loro), ma purtroppo la perfezione non è una caratteristica di questo mondo sublunare, in modo che l'apprendimento di strategie bug-soluzione è un inevitabile parte della vita; -).
Altri suggerimenti
La funzione PyCell_Check
controlla che la sua tesi in realtà è un oggetto cella (un tipo interno utilizzato per implementare variabili fa riferimento più ambiti). Se op
non è un oggetto di cellule, si ottiene questo errore.
Il codice che hai postato non dà sufficienti contesto / informazioni per determinare esattamente come il parametro male è venuto per essere passato.