Menu
Coddy logo textTech

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>

上記の例では、デコレータが関数からの値を返していることに注目してください。これまでは、結果を返さずに関数を実行するだけのデコレータしか見てきませんでした。

challenge icon

チャレンジ

中級

整数引数 n を受け取り、与えられた関数 funcn 層の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オンラインコンパイラ