본문 바로가기

파이썬/2. 파이썬 심화

파이썬 데코레이터(Decorator) + *args, **kwargs

데코레이터

  • 함수를 꾸며주는 장식자
  • 기존 코드를 수정하지 않고도 기능을 추가할 수 있다.
def decorator(function):
    def wrapper():                                           # 받은 함수를 실행
        print('{} 함수 호출 요청'.format(function.__name__))
        return function()
    return wrapper


@decorator_function  # 아래 함수를 function 인자로 넣어준다.
def abc():
    print('abc 함수 실행 완료.')


@decorator_function  # 아래 함수를 function 인자로 넣어준다.
def xyz():
    print('xyz 함수 실행 완료.')

abc()
print
xyz()

# abc 함수 호출 요청
# abc 함수 실행 완료.
# 
# xyz 함수 호출 요청
# xyz 함수 실행 완료.

이런식으로 decorator를 사용하면 기능을 간편하게 추가할 수 있다.

 

근데 만약 단순한 출력만이 아니라 인자가 필요한 함수를 추가한다면??

decorator -> wrapper -> 추가한 함수 순서대로 실행이 되는데

보다싶이 wrapper함수는 인자를 전달하지 않는다.

어떻게 해야할까?

def decorator(function):
    def wrapper(*args, **kwargs):                                           # 받은 함수를 실행
        print('{} 함수 호출 요청'.format(function.__name__))
        return function()
    return wrapper


@decorator_function  # 아래 함수를 function 인자로 넣어준다.
def abc():
    print('abc 함수 실행 완료.')


@decorator_function  # 아래 함수를 function 인자로 넣어준다.
def name_age():
    print('name_age 함수 실행 완료. name={}, age={}'.format(name, age))

abc()
print
name_age('lee', 23)

# abc 함수 호출 요청
# abc 함수 실행 완료.
# 
# name_age 함수 호출 요청
# name_age 함수 실행 완료. name=lee, age=23

그럼 인자를 전달하게 하면 된다.

단 전달할 만큼 미리 정해두는게 아니라(미리 정해두면 인수의 개수가 바뀔때마다 변경해줘야 한다;;)

*args, **kwargs를 사용한다.

 

*args

  • arguments
  • tuple 형태
  • 받은 만큼 전달한다.
  • 꼭 *args일 필요는 없다.(*abc도 기능한다. *이 핵심)

**kwargs

  • keyword argument
  • dictionary 형태 {'키워드':'밸류'}의 형태로 전달

더 자세한 내용은 아래 링크를 참고할 것.

http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorator/