문제

클래스 메소드의 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top