Cython拡張モジュールで定義されたクラスメソッドの動的使用

StackOverflow https://stackoverflow.com/questions/725777

  •  05-09-2019
  •  | 
  •  

質問

私はそれがある場合( 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 のモジュール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 のモジュールの内容

役に立ちましたか?

解決

[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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top