nathan_H

Decorator 본문

Programming Laguage/Python

Decorator

nathan_H 2019. 4. 26. 13:45

decorator는 하나의 함수를 취해

또 다른 함수를 반환하는 함수이다.

 

 

from functools import wraps


def document_it(func):
    @wraps(func)
    def new_function(*args, **kwargs):
        print("Running function:", func.__name__)
        print('Positional arguments:', args)
        print("Keyword arguments:", kwargs)
        result = func(*args, **kwargs)
        print("Result:", result)
        return result

    return new_function

데코레이터의

코드를 보면

 

크게 3가지 장치를 활용해 구성되어 있다.

 

*args, **kwargs

내부 함수 

함수 인자

 

외부 함수에 어떤 인자 함수 이름을 전달하든지

외부 함수에 추가 선언문이 포함된 새 함수를 얻는다.

 

데코레이터는 외부 함수에서 인자로 전달 받은 함수를 호출해 

결과를 출력 할뿐만 아니라 새로운 함수를 얻는다.

 

from functools import wraps


def document_it(func):
    @wraps(func)
    def new_function(*args, **kwargs):
        print("Running function:", func.__name__)
        print('Positional arguments:', args)
        print("Keyword arguments:", kwargs)
        result = func(*args, **kwargs)
        print("Result:", result)
        return result

    return new_function


def square_it(func):
    @wraps(func)
    def new_function(*args, **kwargs):
        result = func(*args, **kwargs)
        return result * result

    return new_function


def without_wraps_square(func):
    def new_function(*args, **kwargs):
        result = func(*args, **kwargs)
        return result * result

    return new_function


@square_it
@document_it
def add_ints(a, b):
    '''두수의 합을 리턴'''
    return a + b


@without_wraps_square
def sub_ints(a, b):
    '''두수의 차를 리턴'''
    return a - b


if __name__ == "__main__":
    print(add_ints(1, 2))
    '''
    출력 
    Running function: add_ints
	Positional arguments: (1, 2)
	Keyword arguments: {}
	Result: 3
	9
    '''
    print(add_ints.__name__)  # use wraps 
    # 출력 add_ints
    print(add_ints.__doc__)
    # 출력 두수의 합을 리턴
    print(sub_ints.__name__)  # not use wraps
    # 출력 new_function
    print(sub_ints.__doc__)
    # 출력 None

 

 

 

 

추가로 @wraps은

wrapper로써 함수를 감싸는 역활을 한다.

 

위 코드에서 wraps을 사용하지않은 decorator은

new_function이 전달 받은 함수인자 sub_ints을 감싸기 때문에

name과 doc이 new_functio으로 출력된다.

 

그래서 wraps을 사용해

인자로 받은 함수의 name과 docsting을 

출력할 수 있다.

'Programming Laguage > Python' 카테고리의 다른 글

python - class method type.  (0) 2019.04.30
python - function 과 method  (0) 2019.04.30
python - namespace  (0) 2019.04.26
Closure.  (0) 2019.04.26
python - 진수 변환, ascll code 변환  (0) 2019.04.18
Comments