[Python] decorator를 이용한 함수의 doc string 구하기 Develop Tip

파이썬에서 데코레이터에 대한 고찰을 확인해 본 적이 있습니다만,
아래와 같은 아주 간단한 데코레이터를 이용한 foo 라는 함수가 있다고 가정합니다.

def decorator1(f):
    def _decorator():
        print('decorator active')
        f()
    return _decorator


@decorator1
def foo():
    """the magic foo function"""
    print('this is function foo')


print('foo.__doc__="%s"' % foo.__doc__)

위에서 foo 함수위에 @decorator1 라는 데코레이터가 없다면

print('foo.__doc__="%s"' % foo.__doc__)

의 결과로

foo.__doc__="the magic bar function"

와 같이 나올 것입니다.

help(foo) 라고 도움말 함수를 출력해도 동일합니다.

그런데 실제 위와 같은 결과를 돌려보면,

foo.__doc__="None"

와 같은 결과가 나옵니다.
조금 살펴보니 아하! 데코레이터가 우선 불리기 때문에 
해당 데코레이터의 docstring 이 없어(None) 발생하는 것이군요.

그럼 해당 함수의 __doc__ string을 어떻게 넘길까 고민이 되었습니다.

다음과 같은 wraps 라는 것이 결국은 답이었습니다.


from functools import wraps


def decorator2(f):
    @wraps(f)
    def _decorator():
        print('decorator active')
        f()
    return _decorator


@decorator2
def bar():
    """the magic bar function"""
    print('this is function bar')


print('bar.__doc__="%s"' % bar.__doc__)


@decorator2
def foobar():
    """the magic foobar function"""
    print('this is function foobar')


print('foobar.__doc__="%s"' % foobar.__doc__)


위의 결과를 돌리면,

bar.__doc__="the magic bar function"
foobar.__doc__="the magic foobar function"

와 같이 원하는 결과가 잘 나왔습니다.

해당 문서를 읽어보면 함수를 래핑 시킬 때,
본래 함수의 속성을 가져오는 것으로 보입니다.


어느 분께는 도움이 되셨기를 ..


덧글

댓글 입력 영역

구글애드텍스트