파이썬/파이썬(python) 중급

*args 인자가 있는 데코레이터 함수 실습하기

Olivia-BlackCherry 2022. 11. 10. 07:38

함수 파라미터 앞에 아스테리스크(*)를 붙이면, 

함수를 호출할 때 몇 개의 인수라도 허용한다는 뜻이다.

 

아래의 코드에서 사용자 정의 함수를 만들었는데, 파라미터로 *number를 적어서

여러 개의 파라미터를 가지도록 했다.

def calculate(*number):
    print(f"결과값은 {number[0] + number[1] + number[2]}")

 

calculate를 호출해보자.

calculate(1,2,3)

>>결과값은 6

 

 

이번에는 calculate 함수에 새로운 기능을 더해주는 decorator 함수를 만들 것이다.

아래의 조건을 충족시켜서 데코레이터 함수를 만들어보자.

1. 이름은 decorated라고 한다. 
2. 함수의 이름을 호출한다. 
3. 첫 번째, 두 번째, 세 번째 인수를 호출한다. 
4. 마지막으로 원래 함수(calculated)의 결괏값을 반환한다. 

 

여기서 중요한 것은 func = calculated 함수가 파라미터를 여러개 갖기 때문에

wrappered 함수에서도 파라미터로 *args가 와야한다는 점이다. 

4번에서도 마지막으로 원래 함수의 결괏값을 반환하기 위해 

함수를 실행할 때도, 파라미터에 주의해야 한다.

def decorated(func):
    def wrappered(*args):
        print(f"{func.__name__}의 첫 번째 인수는 {args[0]}, 두 번째 인수는 {args[1]}, 세 번째 인수는 {args[2]}")
        return func(*args)
    return wrappered

 

<최종코드>

def decorated(func):
    def wrappered(*args):
        print(f"{func.__name__}의 첫 번째 인수는 {args[0]}, 두 번째 인수는 {args[1]}, 세 번째 인수는 {args[2]}")
        return func(*args)
    return wrappered

@decorated
def calculate(*number):
    print(f"결과값은 {number[0] + number[1] + number[2]}")

calculate(1,2,3)