デコレータの処理内容を、環境変数などで条件分岐させたいことってあると思います。
結論
以下のようなデコレータを引数にとるデコレータをつくる
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