动态使用用Cython扩展模块中定义的一类方法的
题
我想用C实现一个类的方法(从用Cython 产生)的,如果它是本,或者如果C扩展不存在使用它的Python等效。我第一次尝试这样的:
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