7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

デコレータを条件分岐する

Posted at

デコレータの処理内容を、環境変数などで条件分岐させたいことってあると思います。

結論

以下のようなデコレータを引数にとるデコレータをつくる

def attach_decorator(condition, decorator):
    return decorator if condition else lambda x: x

条件がfalseの場合、元のデコレータの機能を無効化するように書いてますが、そこはユースケースに応じて適宜変更してください。

例:

XRAY_CONDITION = ENV in ['dev', 'stg', 'prod']

@attach_decorator(XRAY_CONDITION, xray_recorder.capture('hoge'))
def hoge():

経緯

プロファイラーってデコレータで提供されることが多いと思うのですが、プロファイラーをデプロイ後だけ適応し、ローカル開発時には適応したくない、という状況になりました。分岐条件を引数にとるデコレータをつくることで、デコレータを環境ごとに書いたり消したりする必要がなくなり、常に書いておくことができます。

デコレータはデコレートする関数を引数にとる関数なので、条件を満たさない場合は、引数の関数をそのまま返す作りにしました。

>>> hoge = lambda x: x
>>> @hoge
... def huga(x):
...     print(x)
...
>>> huga('hogehoge')
hogehoge

参考

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?