デコレータなど、Pythonにおける関数の装飾に関する質問です。
クラウドシステムへのRequest, Responseを行うPythonのOSSがあります。
python
1import cloudsys #例です。 2 3cloudsys.request('abc')
このOSSには、ログ管理の機能が付いていないので、付与したいと考えています。
ただし、
- OSSのGitHub側にmerge requestはしない
- ローカルに落としたcloudsysのソースコードを改変したくない
- requestを呼び出す前後などにログの処理を直接書きたくない
という前提があります。
このとき、次のような関数を用いれば解決できると思います。
python
1def deco(func): 2 def wrapper(*args, **kwargs): 3 print('start logging') 4 logging(*args, **kwargs) 5 print('end logging') 6 return wrapper 7 8deco(cloudsys.request)('abc') #ログ取得完了
これはデコレータに関する記事を見て思いついたものです。
ただし、次のような記述の方法のログのとり方だと、エラーが生じます。
python
1@deco 2cloudsys.request('abc') #エラー
通常、ログを取るとためには、cloudsys.py、つまり呼び出し先のソースコードにおいて、
python
1def deco(func): 2 def wrapper(*args, **kwargs): 3 print('start logging') 4 logging(*args, **kwargs) 5 print('end logging') 6 return wrapper 7 8@deco 9def request(str): 10 return 'response'
という記述だけ書いておいて、利用者側は、
python
1cloudsys.request('abc') #ログ取得完了
と記述するだけで、ログが取られると思います。
質問としては、めったに見かけない記法である、
python
1deco(cloudsys.request)('abc') #ログ取得完了
は良いお作法の書き方であるのか、ということです。
もしもデコレータに限らず、ログを取得するために便利な関数があれば教えてもらいたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/29 14:37