[解決済み] Pythonのデコレーターが関数をラップする前にパッチを当てることはできますか?
2023-01-10 11:23:16
質問
Pythonの助けを借りてテストしているデコレータを持つ関数があります。
モック
ライブラリの助けを借りてテストしようとしています。私は
mock.patch
を使用して、実際のデコレータを単に関数を呼び出すだけのモック「バイパス」デコレータに置き換えます。
わからないのは、本物のデコレータが関数をラップする前にパッチを適用する方法です。パッチターゲットにいくつかの異なるバリエーションを試し、パッチと import ステートメントを並べ替えてみましたが、成功しませんでした。何かアイデアはありますか?
どのように解決するのですか?
デコレータは、関数定義時に適用されます。ほとんどの関数では、これはモジュールがロードされたときです。(他の関数で定義されている関数は、その関数が呼ばれるたびにデコレータが適用されます)。
ですから、もしあなたがデコレーターを猿真似したいのであれば、 必要なことは
- それを含むモジュールをインポートする
- モックデコレータ関数を定義する
-
設定
など
module.decorator = mymockdecorator
- デコレータを使用するモジュールをインポートするか、独自のモジュールで使用します。
デコレータを含むモジュールに、それを使用する関数も含まれている場合、それらはあなたが見ることができる時点で既に装飾されており、あなたはおそらくS.O.L.でしょう。
最初にこれを書いてからPythonの変更を反映させるために編集しました。もしデコレータが
functools.wraps()
を使っていて、Python のバージョンが十分に新しい場合、元の関数を掘り出すことができるかもしれません。
__wrapped__
属性を使って元の関数を見つけ出し、それを再装飾することができるかもしれません。しかし、これは決して保証されたものではなく、置き換えたいデコレータが適用されている唯一のデコレータであるとは限りません。
関連
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] Pythonスクリプトのプロファイリングはどのように行うのですか?
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] 誰かPythonで__all__を説明してくれませんか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] Pythonの関数が例外を投げるかどうかをテストするにはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】入力引数に基づくpython関数のモッキング
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複