我想使用类方法的C实现(从Cython生成),如果它存在,或者如果C扩展不存在则使用它的Python等价。我第一次尝试这个:
class A(object):
try:
import c_ext
method = c_ext.optimized_method
except ImportError:
def method(self):
return "foo"
其中optimize_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"
但在每个函数调用中检查模块的存在似乎都不是最理想的......为什么我的第一个方法不起作用?
[edit]:添加了Cython模块的内容
答案 0 :(得分:4)
好的,我刚刚找到答案......
问题来自Cython wraps the functions it exports的方式:无论引用的位置如何,每个方法都是未绑定的。
解决方案是显式声明绑定方法:
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