デコレーターの適用順

Pythonのデコレーターについての覚書。

Pythonでは1つの関数に複数のデコレーターを適用できますが、複数適用した場合の実行順が気になったので考察してみました。

@deco1()
@deco2()
def deco_rare():
  do_your_work()

結論から言えば、この場合、deco_rare() の実行時には deco2 が先に適用されて、そのあとに deco1 が適用されるようです。考え方としては、元々の関数 (deco_rare) に直近のデコレーター (deco2) が適用されたものに対し、更にその上位のデコレーター (deco1) が適用されるというイメージです。

例えば実行権限を確認するデコレーターの実装では、最初にその権限確認が行われるようにして、権限不足の場合にはあとの処理をそもそも省くようにしたいものです。実行順(適用順)を意識してデコレーターを指定します。