オプションの引数を持つデコレータの作成 [重複]。
2023-12-05 11:52:37
質問
from functools import wraps
def foo_register(method_name=None):
"""Does stuff."""
def decorator(method):
if method_name is None:
method.gw_method = method.__name__
else:
method.gw_method = method_name
@wraps(method)
def wrapper(*args, **kwargs):
method(*args, **kwargs)
return wrapper
return decorator
例 以下は
my_function
を
foo_register
にするのではなく
decorator
.
@foo_register
def my_function():
print('hi...')
例 以下は期待通りに動作します。
@foo_register('say_hi')
def my_function():
print('hi...')
もし、両方のアプリケーションで正しく動作させたいのであれば (一方は
method.__name__
を使うものと、名前を渡すもの) の両方が正しく動作するように、私は
foo_register
の内部で、最初の引数がデコレータであるかどうかを確認し、 もしそうなら
return decorator(method_name)
(代わりに
return decorator
). このような "check to see it's a callable" は、非常にハッキング的だと思われます。このような複数回使用できるデコレーターを作成するためのより良い方法はありますか?
追伸:デコレータが呼び出されることを要求できることはすでに知っていますが、それは"解決策"ではありません。私は API が自然に感じられるようにしたいのです。私の妻は装飾が好きなので、それを台無しにしたくありません。
どのように解決するのですか?
グレン - その時はそうするしかなかったんだ。魔法のような方法でなくてよかったと思います。私はそれが嫌いなんです。
ということで、私なりの答えです(メソッド名は上記と異なりますが、コンセプトは同じです)。
from functools import wraps
def register_gw_method(method_or_name):
"""Cool!"""
def decorator(method):
if callable(method_or_name):
method.gw_method = method.__name__
else:
method.gw_method = method_or_name
@wraps(method)
def wrapper(*args, **kwargs):
method(*args, **kwargs)
return wrapper
if callable(method_or_name):
return decorator(method_or_name)
return decorator
使用例(どちらのバージョンも同じように動作します)。
@register_gw_method
def my_function():
print('hi...')
@register_gw_method('say_hi')
def my_function():
print('hi...')
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Argparse オプションの位置引数?
-
[解決済み] パラメータを持つデコレータ?
-
[解決済み】TypeScriptのコンパイルでExperimental decoratorsの警告が出る。
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] バブルソートの宿題
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
最新
-
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: セッションの作成と再利用
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] パラメータ付きでもパラメータなしでも使えるデコレータを作るには?