Cython拡張モジュールで定義されたクラスメソッドの動的使用
質問
私はそれがある場合( Cythonするから生成された)クラスメソッドのC実装を使用したいですC拡張子が存在しない場合に存在する、またはPythonの等価物を使用します。私が最初にこれを試します:
class A(object):
try:
import c_ext
method = c_ext.optimized_method
except ImportError:
def method(self):
return "foo"
optimized_methodはhref="http://www.cython.org/" rel="nofollow noreferrer"> Cython のモジュール しかし、これは動作しません。 私はこの仕事をするために見つけた唯一の方法は、次のとおりです。 しかし、それぞれの関数呼び出しでモジュールの存在をチェックすると、なぜ私の最初のアプローチが認識されないのは...かなり次善のようだ? [編集]:追加 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"
解決
[OK]を私は答えを見つけた...
問題は、道から来て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