3

如果存在,我想使用类方法的 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"

但是在每个函数调用中检查模块的存在似乎并不理想......为什么我的第一种方法不起作用?

[编辑]:添加Cython模块的内容

4

1 回答 1

4

好的,我刚刚找到了答案...

The problem comes from the way Cython wraps the functions it exports: every method is unbound regardless from where it is referenced.

The solution is to explicitly declare a bound method:

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
于 2009-04-07T15:11:47.650 回答