python3.3 で導入された新しい smtplib 機能に興味があります:マルチホームマシン (または複数の IP アドレスを持つマシン) で特定の IP アドレスにバインドする機能です。
私が使用したい多くのビルディング ブロックは 3.3 に移植されていないか、ポートが非常に不安定であるため、この機能のためだけに 3.3 を使用するという考えは実用的ではありません。
この機能をバックポートするために、パッチまたはモンキーパッチを適用できます。私は smtplib.SMTP をサブクラス化し、基になるソケットにモンキーパッチを適用する傾向があります。これは、展開を簡素化し、基本クラスに影響を与える可能性が低く、政治的に正しいバックポートよりも簡単だからです。
Ruby の世界では、モンキーパッチはより容認されていますが、ほとんどの Python サークルでは、この危険ではあるが頻繁に役立つ手法は嫌われています。
私の質問は次のとおりです。そのような決定に直面したことがありますか、またはアドバイスを共有したいと思いますか?
(各アプローチの長所と短所に興味があります)
[アップデート]
pps 実際には、もう少し考えてみると、モンキー パッチは既存のクラスをインプレースで何らかの方法で変更することを意味し、標準の場所からロードするときに新しいコードが呼び出されることを常に想定していました (認めざるを得ませんが、今考えてみると、方法がわかりません)あなたはこれを行うことができます)。それは私がここで提案していることではありません - このサブクラスは、私自身のコードでのみ使用される、私自身のモジュール内の新しいクラスになります。【アンドリュー・クック】
アンドリュー、時間を割いて答えてくれてありがとう。このようにすれば、SMTP.connect コードをいくつかフォークすることになり、元のライブラリが更新されたときにフォークしたコードに変更が反映されないため、眉をひそめられます。私は mokeypatching をより外科的なものと考えていますが、そのような更新は、monkeypatched コードの周りにリファクタリングがある場合、コードを壊す可能性もあります。私のジェダイ マスターをフォークするか、モンキー パッチを適用するかのどちらかが好きではありません。彼らが導くダークサイドに。:-)
[アップデート]
最後に、送信 IP アドレスを選択できる拡張 EHLO 構文を受け入れる SMTP プロキシを作成しました。
s = SMTP('localhost', 8025)
# will use 173.22.213.16 as the outgoing IP address
s.ehlo('example.com 173.22.213.16')
twistedを使用するとSLOCは 40 未満でした。twistedはネットワーク コードにとって驚くべきものであり、別のプロセスを実行することを犠牲にして、2.7 ですべてを実行できます。