Chaining Decorators
Coddyの「Pythonデコレーター」コースのレッスン 7/12。
複数のデコレータを連結(チェーン)させて、関数の動作を修正することが可能です。デコレータを連結するには、単にそれらを順番に適用するだけです。その際、最も内側のデコレータが、デコレートされる関数に最も近くなるように配置します。
以下に例を示します:
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>上記の例では、デコレータが関数からの値を返していることに注目してください。これまでは、結果を返さずに関数を実行するだけのデコレータしか見てきませんでした。
チャレンジ
中級整数引数 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オンラインコンパイラ