Cython 확장 모듈에 정의 된 클래스 방법의 동적 사용
문제
클래스 메소드의 C 구현을 사용하고 싶습니다 ( 시톤) 존재하는 경우, 또는 C 확장이없는 경우 파이썬을 사용하십시오. 나는 이것을 먼저 시도했다 :
class A(object):
try:
import c_ext
method = c_ext.optimized_method
except ImportError:
def method(self):
return "foo"
여기서 Optimized_Method는 a에 정의 된 함수입니다 시톤 기준 치수:
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 방식에서 비롯됩니다 수출하는 기능을 래핑합니다: 모든 방법은 참조되는 위치와 상관없이 결함이 없습니다.
해결책은 바운드 방법을 명시 적으로 선언하는 것입니다.
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
제휴하지 않습니다 StackOverflow