سؤال

ها هو الخطأ.

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 ليس كائن خلية، وسوف تحصل على هذا الخطأ.

لا يعطي الرمز الذي نشرته سياق / معلومات كافية لتحديد بالضبط كيفية تمرير المعلمة السيئة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top