[Pre-course] 2021. 10. 11-1

GYUBIN ·2021년 10월 11일
0

Python

Pre-course 문제와 함께하는 헛갈리는 개념 바로잡기


Decorator

Decorator에 대한 개념 정리는 wikidocs.net을 참고하자

Decorator를 구현해보세요.

greeting 함수에 적용될 decorator 함수를 구현하여 greeting 함수에 적용해주세요.

greeting 함수가 호출 되었을때 decorator 함수에 parametor 값이 greeting 함수 리턴값의 다음에 붙혀져서 리턴되어야 합니다.

Decorator 함수의 이름은 welcome_decorator 여야 합니다.

예를 들어, 다음 처럼 정의 하여 welcome_decorator decorator를 적용하여 greeting을 호출하면:

@welcome_decorator
def greeting():
    return "Hello, "
greeting()

결과값은 다음과 같아야 합니다.

"Hello, welcome to WECODE!"

greeting에서 "Hello, " 가 return 되기 때문에 welcome_decorator 에서 "welcome to WECODE!" 를 return 해야 한다

Decorator를 먼저 구현해보자

def welcome_decorator(func):
    def wrapper():
        return (func() + "welcome to WECODE!")
    return wrapper
# "Hello, welcome to WECODE!" 처럼 한 줄로 출력하기 위해 +를 사용했다
@welcome_decorator
def greeting():
    return "Hello, "
# 구현한 Decorator를 적용시켰다( @welcome_decorator )
print(greeting())
# "Hello, welcome to WECODE!" 출력을 확인할 수 있다

실행은 문제 없지만 점프 투 파이썬에서 강조했던 @functools.wraps를 사용해보자

@functools.wraps는 데코레이터 함수를 작성할 때 함수의 올바른 동작을 보장한다

import functools
def welcome_decorator(func):
    @functools.wraps(func)
    def wrapper():
        return (func() + "welcome to WECODE!")
    return wrapper
@welcome_decorator
def greeting():
    return "Hello, "
print(greeting())

문자열을 입력받아 출력

greeting 함수를 문자열을 입력받아 출력하도록 바꿔보자

welcome_decorator는 그대로 가져오고 greeting 만 수정해보겠다

import functools
def welcome_decorator(func):
    @functools.wraps(func)
    def wrapper():
        return (func() + "welcome to WECODE!")
    return wrapper
@welcome_decorator
def greeting(input):
    return f"{input}, "
print(greeting())

TypeError: wrapper() takes 0 positional arguments but 1 was given 에러가 발생했다

greeting 함수는 입력인수가 필요한데 decoratorwrapper 함수는 전달받은 greeting 함수를 입력인수 없이 호출하기 때문이다

따라서 입력인수를 추가해줘야 하는데 decorator 의 경우 기존함수가 어떤 입력인수를 취할지 알 수 없기 때문에 *args**kwargs를 이용해서 기존 함수의 입력인수에 상관없이 동작하도록 만들어줘야 한다

최종으로 수정해보자

import functools
def welcome_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        return (func(*args, **kwargs) + "welcome to WECODE!")
    return wrapper
@welcome_decorator
def greeting(input):
    return f"{input}, "
print(greeting("Hello"))
# "Hello, welcome to WECODE!" 출력
print(greeting("Hi"))
# "Hi, welcome to WECODE!" 출력

0개의 댓글

관련 채용 정보