モンキーパッチは、「最も悪が少ない」場合があります。ほとんどの場合、テスト容易性のために適切に設計されていないサブシステムを使用するコードをテストする必要がある場合(依存性注入などをサポートしていません)。そのような場合、テストハーネスで(非常に一時的に、幸運にも)モンキーパッチを適用し、テストを分離する(つまり、統合テストではなく単体テストにする)目的で、ほとんどの場合、モックまたは偽物を使用してモンキーパッチを適用します。
この「悪いが、もっと悪いかもしれない」ユースケースはあなたの例には当てはまらないようです-アプリケーションレベルのコードを編集して適切なラッパー関数(たとえば、myos.chown
裸ではなく)を呼び出し、ラッパー関数は、アプリケーションレベルのコードと標準ライブラリ(またはラップしているサードパーティの拡張機能-この点で標準ライブラリに特別なことは何もありません)の間にあるos.chown
独自の中間モジュール(など)で機能します。myown
「アプリケーションレベルのコード」が実際に制御されていない場合、問題のある状況が1つ発生する可能性があります。これは、変更したくないサードパーティのサブシステムです。それにもかかわらず、そのような状況では、(標準ライブラリ関数を直接ではなく)ラッパーを呼び出すようにサードパーティのサブシステムを変更する方が、長期的にははるかに生産的であることがわかりました。もちろん、サードパーティのメンテナに変更を送信します。問題のサブシステムでは、変更をサブシステムの次のリリースにロールバックし、すべての人の生活が向上します(変更が受け入れられると、他のユーザーによって定期的に保守およびテストされるため、含まれています!-)。
(補足として、このようなラッパーは標準ライブラリに差分として送信する価値があるかもしれませんが、標準ライブラリは非常にゆっくりと慎重に進化し、特にPython 2ラインではもはや進化しないため、これは別のケースです。 、2.7はその行の最後であり、機能が凍結されているため)。
もちろん、これはすべてオープンソース文化を前提としています。いくつかの不思議な理由で、クローズドソースのサードパーティサブシステムを使用している場合、つまり維持できない可能性がある場合は、モンキーパッチがそれほど悪ではない可能性がある別の状況にあります(ただし、それは戦略的制御を失うことの悪のためですおそらく維持できないコードを信頼することによる開発のそれ自体が非常に大きな悪です;-)。クローズドソースであり、それ自体がPythonで記述されたサードパーティのパッケージを使用してこのような状況に陥ったことは一度もありません(後者の条件が当てはまらない場合は、monkeypatchesは役に立ちません;-)。
ここで、「クローズドソース」の実用的な定義は非常に厳密であることに注意してください。たとえば、12年以上前のMicrosoftでさえ、Visual C ++を使用したMFCなどのライブラリのソースを配布しました(製品は当時呼ばれていました)。ソースを再配布することはできませんでしたが、それでも、ソースが手元にあるので、ひどい制限やバグに遭遇した場合は、修正することができます(そして、将来のリリースのために変更を送信し、変更を次のように公開します著作権で保護されたコードがまったく含まれていない限り、差分です。些細なことではありませんが、実行可能です)。
そのようなアプローチが「最も悪が少ない」という厳格な範囲をはるかに超えたモンキーパッチは、動的言語のユーザーのよくある間違いです。自分自身がその罠に陥らないように注意してください。