[解決済み] Pythonのデコレータに追加の引数を渡すには?
2022-08-30 18:24:21
質問
以下のようなデコレータがあります。
def myDecorator(test_func):
return callSomeWrapper(test_func)
def callSomeWrapper(test_func):
return test_func
@myDecorator
def someFunc():
print 'hello'
このデコレータを拡張して、以下のような別の引数を受け取れるようにしたい。
def myDecorator(test_func,logIt):
if logIt:
print "Calling Function: " + test_func.__name__
return callSomeWrapper(test_func)
@myDecorator(False)
def someFunc():
print 'Hello'
しかし、このコードではエラーが発生します。
TypeError: myDecorator() はちょうど2つの引数を取ります (1つは指定されています)
なぜ関数は自動的に渡されないのでしょうか?デコレータ関数に明示的に関数を渡すにはどうしたらよいでしょうか。
どのように解決するのですか?
デコレータを関数のように呼び出しているので、実際のデコレータである別の関数を返す必要があります。
def my_decorator(param):
def actual_decorator(func):
print("Decorating function {}, with parameter {}".format(func.__name__, param))
return function_wrapper(func) # assume we defined a wrapper somewhere
return actual_decorator
外側の関数には明示的に渡した引数が渡され、内側の関数を返します。内側の関数は、デコレートする関数を渡され、変更された関数を返します。
通常、デコレータは関数の振る舞いをラッパー関数でラップして変更することを望みます。以下は、関数が呼ばれたときにオプションでロギングを追加する例です。
def log_decorator(log_enabled):
def actual_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if log_enabled:
print("Calling Function: " + func.__name__)
return func(*args, **kwargs)
return wrapper
return actual_decorator
は
functools.wraps
の呼び出しは、名前とdocstringのようなものをラッパー関数にコピーし、元の関数とより似たものにします。
使用例です。
>>> @log_decorator(True)
... def f(x):
... return x+1
...
>>> f(4)
Calling Function: f
5
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] Python 言語を決定するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。