动态使用Cython扩展模块中定义的类方法

时间:2009-04-07 13:44:10

标签: python methods cython

我想使用类方法的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模块的内容

1 个答案:

答案 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