سؤال
ها هو الخطأ.
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
إليك رمز بيثون المعني.
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)
وهنا مصدر بيثون المعني.
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);
}
المحلول
من الواضح أن هناك خطأ داخلي خطأ في Python نفسه، وإذا كنت مهتما بمزيد من استكشاف ذلك وتقديم إصلاح ل Python Core، فقم بتبسيط التعليمات البرمجية لأسفل إلى المكان الذي لا يزال بمكان تشغيل الخطأ سيكون الاستراتيجية الصحيحة.
إذا كنت مهتما بأكثر اهتماما بعمل التعليمات البرمجية الخاصة بك، بدلا من تحديد جوهر الثعبان، فأنا أقترح عليك تجنب بعض الحالات الشاذة العديدة في التعليمات البرمجية التي قد تساهم في مربكة Python. على سبيل المثال، لا أعرف أن أي شخص فكر في اختبار العقار لوظيفة متداخلة اسمه f
تحتوي على وظيفة أخرى أخرى متداخلة أيضا اسم الشيئ f
- يجب أن تعمل، ولكن هذا هو بالضبط نوع الشيء الذي قد لا يكون قد تم اختباره جيدا لمجرد أنه لا أحد يفكر به بعد، وعلى الرغم من إثارة مثل هذه الشذوذ عمدا استراتيجية جيدة للغاية لقمع مجموعة من الاختبارات، فقد يكون من الأفضل تجنبت إذا لم تكن متعمد لتشغيل الأخطاء في فطيرة في فثرون.
لذلك، أولا، أود أن أتأكد من عدم وجود مروي. إذا كان ذلك لا يزال يترك الخطأ، فأنا أزيل استخدام كائنات الخلايا عن طريق تشغيل ما يصل حاليا إلى المتغيرات غير المحلية في "حجج مسبق"، على سبيل المثال "شبه الخارجي" f
يمكن أن تكون التغييرات لتبدأ مع:
def f(self=self):
ويمكن أن يصبح "واحد داخلي واحد":
def g(req, self=self):
هذا من شأنه أن يصل الوصول إلى self
في أي من هذه الوظائف (الوصول المتغير غير المحلي حاليا) إلى الوصول المتغير المحلي. نعم، يجب ألا تضطر إلى القيام بذلك (يجب ألا يكون هناك أي أخطاء في أي برنامج، وهذا يتطلب منك العمل من حولهم)، لكن Alas Perfection ليس خاصا بهذا العالم Sublunar، بحيث يكون التعلم الاستراتيجيات الحل البغيضة أمر لا مفر منه جزء من الحياة؛-).
نصائح أخرى
ال PyCell_Check
يتحقق الدالة أن حجةها هي فعلا كائن خلية (نوع داخلي يستخدم لتنفيذ المتغيرات المشار إليها بواسطة نطاقات متعددة). إذا op
ليس كائن خلية، وسوف تحصل على هذا الخطأ.
لا يعطي الرمز الذي نشرته سياق / معلومات كافية لتحديد بالضبط كيفية تمرير المعلمة السيئة.