3

クラス メソッドの 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モジュールの内容を追加

4

1 に答える 1

4

わかりました、私はちょうど答えを見つけました...

問題は、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
于 2009-04-07T15:11:47.650 に答える