[解決済み] Pythonで関数にパッチを当てるには?
2023-07-08 21:36:28
質問
別のモジュールの関数を別の関数に置き換えるのに苦労しており、気が狂いそうです。
例えば、次のようなモジュールbar.pyがあるとします。
from a_package.baz import do_something_expensive
def a_function():
print do_something_expensive()
そして、もう一つ、こんな感じのモジュールがあります。
from bar import a_function
a_function()
from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
a_function()
import a_package.baz
a_package.baz.do_something_expensive = lambda: 'Something really cheap.'
a_function()
という結果が得られると予想されます。
Something expensive!
Something really cheap.
Something really cheap.
しかし、その代わりにこうなる。
Something expensive!
Something expensive!
Something expensive!
私は何を間違えているのでしょうか?
どうすればいいのでしょうか?
Pythonの名前空間がどのように機能するかを考えるのに役立つかもしれません: それは本質的に辞書です。 ですから、これを実行するとき
from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
はこのように考えてください。
do_something_expensive = a_package.baz['do_something_expensive']
do_something_expensive = lambda: 'Something really cheap.'
うまくいけば、なぜこれがうまくいかないのかがわかると思います :-) 名前を名前空間にインポートすると、インポートした名前空間での名前の値は から の名前の値は関係ありません。 ローカルモジュールの名前空間、つまり上記の a_package.baz の名前空間にある do_something_expensive の値を変更するだけです。 しかし、barはモジュールの名前空間から参照するのではなく、do_something_expensiveを直接インポートしているので、その名前空間に書き込む必要があります。
import bar
bar.do_something_expensive = lambda: 'Something really cheap.'
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Python 3での相対インポート
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
最新
-
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 のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] バブルソートの宿題
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] if 節の終了方法
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。