ديناميكية استخدام أسلوب فئة محددة في Cython امتداد وحدة
سؤال
أود أن استخدام 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
لا تنتمي إلى StackOverflow