2011-09-22 1 views
1

일반적으로 inspect.getargspec을 사용 하겠지만 바인딩 된 메서드의 인수를 얻으려면 어떻게해야합니까? 나는 방법 '갑'의 인수 이름을 얻는 방법파이썬 메서드에 대한 인수를 얻으려면 어떻게해야합니까?

예는 다음과 같습니다.

class Foo(object): 

    @memoized 
    def foo(self, arg1, arg2): 
     pass 

foo는이 memoized 객체이라고 푸() 참고 http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

이는 것을 의미한다 정말 functools.partial 인스턴스입니다.

원래 함수를 얻거나 어떻게 인수를 얻을 수 있습니까?

내가 할 수 없다면, 이것은 PythonDecoratorLibrary의 디자인 결함을 나타 냅니까?

def __get__(self, obj, objtype): 
    """Support instance methods.""" 
    f = functools.partial(self.__call__, obj) 
    f._wrapped = self.func 
    return f 

또는 그것에서 액세스 않다면 obj가 없음 (즉,없는 경우에는 부분 대신 self.func를 반환 할 수 :

+0

나는이 문제를 해결할 수있는 내 자신의 Memoize 대체품을 효율적으로 작성하여 원래의 기능을 사용할 수 있도록 노력했습니다. – Arafangion

+0

eryksun : 부분적으로 _wrapped 속성을 추가했는데, 이미 .func (카레 함수 인 것 같습니다)가 있기 때문에 이상하게 보일 수 있지만, obj가 None 인 경우 부분 대신 self.func를 반환합니다. '매우 무심코. 그것을 '대답'으로 넣을 수 있을까요, 받아 들일 수 있습니다. 2.7.x를 사용하고 있지만 python3의 lru_cache에 대한 언급은 내가 알고 있어야하는 것처럼 보입니다. 참조를 제공 할 수 있습니까? – Arafangion

답변

2

당신은 당신이 이미 한 일을 할 수있는 부분에 _wrapped 속성을 추가 할 수 있습니다 대신 클래스의 인스턴스)

def __get__(self, obj, objtype): 
    """Support instance methods.""" 
    if obj is None: 
     return self.func 
    else: 
     return functools.partial(self.__call__, obj) 

의 부분 func 속성은 오브젝트의 memoized __call__ 방법이다. Foo 인스턴스에서 호출하면 첫 번째 인수는 partial에 의해 인스턴스 obj로 설정됩니다 (Foo(). foo.args 참조). 그런 다음 memoized.__call__에서 self.func (* args)는 가난한 사람의 바운드 메소드처럼 작동합니다.

lru_cache의 경우 Raymond Hettinger는 ActiveState Code Recipes과 같은 Python 2 호환 구현을 제공합니다. 가장 최근에 사용 된 것 외에 가장 자주 사용되지 않는 버전도 있습니다.

+0

그 두 번째 코드 예제는 특히 고상하게 보입니다. 감사합니다! (lru_cache는 적용 가능합니다. 불행히도 이것을 두 번 받아 들일 수는 없습니다 ...) – Arafangion