Chaining Decorators
Coddy의 Python 데코레이터 코스 레슨. 12개 중 7번째.
함수의 동작을 수정하기 위해 여러 개의 데코레이터를 체이닝(chain)하는 것이 가능합니다. 데코레이터를 체이닝하려면, 데코레이팅되는 함수와 가장 가까운 안쪽 데코레이터부터 차례대로 적용하면 됩니다.
다음은 예시입니다:
def make_bold(func):
def wrapper():
return "<b>" + func() + "</b>"
return wrapper
def make_italic(func):
def wrapper():
return "<i>" + func() + "</i>"
return wrapper
@make_bold
@make_italic
def hello():
return "Hello, world!"
print(hello())최종 출력 결과는 다음과 같습니다:
<b><i>Hello, world!</i></b>위의 예시에서 데코레이터가 함수의 값을 반환(return)한다는 점에 주목하세요. 지금까지는 결과를 반환하지 않고 함수를 실행하기만 하는 데코레이터만 살펴보았습니다!
챌린지
중급정수 인자 n을 받고, 주어진 함수 func를 n개의 HTML 태그 레이어로 감싸는 데코레이터 함수를 반환하는 my_decorator 함수를 작성하세요. 가장 바깥쪽 태그는 <div>여야 하며, 다음 레이어는 <p>여야 합니다. 이후의 각 레이어는 <div>와 <p> 태그가 번갈아 가며 나타나야 합니다. 가장 안쪽 레이어는 함수의 출력값을 <b> 태그로 감싸야 합니다.
my_decorator와 함께 실행될 코드가 제공됩니다. 해당 코드를 변경하지 마세요!
예시:
@my_decorator(3)
def my_function(s):
return s.upper()
result = my_function("hello world")
print(result)출력:
<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>출력 형식을 올바르게 맞추기 위해 줄바꿈(
\n)을 사용하세요!
직접 해보기
# 여기에 코드를 작성하세요
# 이 선 아래로는 수정하지 마세요
n = int(input())
@my_decorator(n)
def my_function(s):
return s.upper()
result = my_function(input())
print(result)Python 데코레이터의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러