質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1008閲覧

Pythonのデコレータの使い方。ログの取得の書き方、関数の装飾について。

bikkle

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/29 13:21

デコレータなど、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') #ログ取得完了

は良いお作法の書き方であるのか、ということです。

もしもデコレータに限らず、ログを取得するために便利な関数があれば教えてもらいたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ごく単純なモンキーパッチで、こういうのは駄目ですか?

python

1cloudsys.request = deco(cloudsys.request)

実際には1つのモジュールにまとめてたくさん書いておき、それをimportすれば使えるようにします。

あと、そのwrapperはfuncの呼び出しがなさそうなので、動きません(意図的にそう書いているのなら構いませんが)。

投稿2019/07/29 14:11

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bikkle

2019/07/29 14:37

ありがとうございます! モンキーパッチというのですね。 概念自体を知らなかったので、調べるのに苦戦していました。 funcは質問する際にloggingへ変更するのを忘れていました。。 とても助かりました!心から感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問