2009-04-07 11 views
3

クラスメソッドのC実装(存在する場合はCythonから生成)を使用するか、C拡張がない場合はPythonの同等のものを使用します。私が最初にこれを試してみました:Cython拡張モジュールで定義されているクラスメソッドを動的に使用

optimized_methodは Cythonモジュールで定義された関数である
class A(object): 
    try: 
     import c_ext 
     method = c_ext.optimized_method 
    except ImportError: 
     def method(self): 
      return "foo" 

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" 

しかし、各関数呼び出しでモジュールが存在するかどうかをチェックすることは、あまりにも最適ではないようです...なぜ私の最初のアプローチは機能しませんか?

[編集]:

+0

は、私はあなたがc_ext.optimized_methodは、明瞭化のために定義されたかを示すことをお勧めしたい:

ソリューションは、明示的にバインドされたメソッドを宣言することです – Moe

答えて

4

[OK]をCythonモジュールの内容を追加しました私は答えを見つけた...

問題は道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 
関連する問題