ديناميكية استخدام أسلوب فئة محددة في Cython امتداد وحدة

StackOverflow https://stackoverflow.com/questions/725777

  •  05-09-2019
  •  | 
  •  

سؤال

أود أن استخدام C تنفيذ أسلوب فئة (ولدت من Cython) إذا كان موجودا, أو استخدام بيثون ما يعادلها إذا كان ج التمديد غير موجودة.كنت في البداية حاول هذا:

class A(object):
    try:
        import c_ext
        method = c_ext.optimized_method
    except ImportError:
        def method(self):
            return "foo"

حيث optimized_method هو وظيفة محددة في Cython الوحدة النمطية:

def optimized_method(self):
    return "fasterfoo"

ولكن هذا لا يعمل:

>>> A().method()
exceptions.TypeError: optimized_method() takes exactly one argument (0 given)

الطريقة الوحيدة التي وجدتها لجعل هذا العمل هو:

class A(object):
    def method(self):
        try:
            import c_ext
            return c_ext.optimized_method(self)
        except ImportError:
            pass
        return "foo"

ولكن التحقق من وحدة الوجود في كل استدعاء دالة يبدو تماما الأمثل...لماذا ليست أول نهج العمل ؟

[تحرير] :وأضاف Cython وحدة محتويات

هل كانت مفيدة؟

المحلول

طيب أنا فقط وجدت الجواب...

المشكلة تأتي من الطريقة Cython يلتف وظائف الصادرات:كل طريقة غير منضم بغض النظر من حيث هو المشار إليه.

الحل هو أن تعلن صراحة ملزمة الطريقة:

class A(object):
    def method(self):
        return "foo"

try:
    import c_ext
    import types
    A.method = types.MethodType(c_ext.optimized_method, None, A)
except ImportError:
    pass
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top