これは私に聞かれたインタビューの質問でした。それが意味をなさない場合は、私にペナルティを科さないでください。彼女は尋ねた:Pythonで既存のサードパーティライブラリの機能を変更する方法
は「(私はPythonで、既存のサードパーティ製のlibを持ち、関数fooがあります)、それにどのように私は私の既存のモジュールにインポートした後、その機能を変更します。?」
これは私に聞かれたインタビューの質問でした。それが意味をなさない場合は、私にペナルティを科さないでください。彼女は尋ねた:Pythonで既存のサードパーティライブラリの機能を変更する方法
は「(私はPythonで、既存のサードパーティ製のlibを持ち、関数fooがあります)、それにどのように私は私の既存のモジュールにインポートした後、その機能を変更します。?」
これは、猿のパッチと呼ばれます。つまり、関数を保持する変数に割り当てることができます。
import existingmodule
existingmodule.foo = lambda *args, **kwargs: "You fail it"
これはまれにしか実際の答えではありません。独自の関数で何かをラップするか、独自の実装を別の場所に提供するか、継承を使用する方が良いでしょう(クラスのメソッドの場合)。あなたはライブラリの独自のコード(または他のサードパーティのコード)に反映されるように変更された行動が必要な場合は、これを行うには
唯一の理由です。もしそうなら、よくテストしてください。これは通常、独自のフォークを作成するよりも優れたアプローチです。つまり、あなたのコードをパッチとして提出することは良い考えかもしれません。だから、それがプロジェクトによって受け入れられればそれをサポートするだけではありません。最も一般的なアプローチはMonkey patchingだろう
(参照:stackoverflow: what is monkey patching)を
例は:
>>> import os
>>> os.listdir('.')
['file_a', 'file_b']
>>> os.listdir = lambda folder: ['nothing in here, nope!']
>>> os.listdir('.')
['nothing in here, nope!']
上で見ることができますPyCon 2012の被写体にありました
話も猿のパッチ適用が有用であることができる場所の非常に良い例を与える: は、特定のことを行うサードパーティのライブラリを持っていると言います。そのためには、このスクリプトはroot権限で実行する必要がありますが、実際の機能にはroot権限は必要ありません。今では第三者図書館がos.geteuid() == 0
でこれをチェックしているかもしれません。 このライブラリを使用するコードでサルのパッチを適用すると、geteuid
を上書きして、この制限を回避するためのルートを偽装することができます。猿のパッチを使用して
は、ライブラリへの迅速な修正を行うための素晴らしい方法です。バグレポートを作成してパッチを待つにはしばらく時間がかかるかもしれないので、図書館のソースコードを掘り下げることなく、この方法で自分自身を手助けすることができます。
何かをするのは "素晴らしい方法"ではありません。それは時には唯一のもの、あるいは何かをするための最も複雑でない方法です。 – Marcin
私の頭の上から離れて、ラッパー機能を使用してください。 –