我想用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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top