monkeypatching stdlib方法在Python中是一个很好的做法吗?

sor*_*rin 2 python monkeypatching word-wrap

随着时间的推移,我发现需要stdlib从Python中覆盖几个方法以克服限制或添加一些缺少的功能.

在所有情况下,我都添加了一个包装函数,并用我的包装器替换了模块中的原始方法(包装器调用了原始方法).

我为什么这样做?只是为了确保对该方法的所有调用都使用我的新版本,即使这些是从其他第三方模块调用的.

我知道monkeypatching可能是一件坏事但我的问题是,如果你小心使用它是否有用?意思是:

  • 您仍然调用原始方法,确保在更新原始模块时没有遗漏任何内容
  • 你没有改变方法的原始"意义"

例子:

像我这样的事情在我看来是不错的覆盖,但我想看看其他人是如何看待他们的,特别是应该被视为可接受的monkeypatch,什么不是.

S.L*_*ott 7

这些东西似乎都不需要 monkeypatching.所有这些似乎都有更好,更强大和可靠的解决方案.

添加日志处理程序很容易.没有monkeypatch.

通过这种方式修复打开.

from io import open
Run Code Online (Sandbox Code Playgroud)

那很简单.没有补丁.

登录到os.system()?我认为一个简单的"包装器"功能远比复杂的补丁更好.此外,我会使用subprocess.Popen,因为这是推荐的替代品.

添加缺失方法来掩盖OS差异(比如os.chown())似乎更适合try/except.但那只是我.我喜欢明确而非隐含.

总的来说,我仍然看不出有关monkeypatching的充分理由.

我讨厌被锁定到遗留代码(例如os.system)因为我过于依赖我的monkeypatches.


"子类"的概念适用于模块和类.您可以轻松编写自己的模块,这些模块(a)导入和(b)扩展现有模块.然后,您使用新模块,因为它们提供了额外的功能.你不需要monkeypatch.

即使这些是从其他第三方模块调用的

可怕的想法.您可以通过更改内置功能轻松打破另一个模块.如果你已经阅读了另一个模块并且确定 monkeypatches不会破坏那么你发现的就是这个.

  1. "其他"模块应该有自定义的空间.它应该有一个"依赖注入"或战略设计模式的地方.好想法.

  2. 一旦找到了这个,就可以修复"其他"模块以允许这种自定义.它可能像解释如何修改对象的文档更改一样简单.它可能是插入自定义的构造的附加参数.

  3. 然后,您可以向作者提供修订后的模块,以了解他们是否支持对其模块的小更新.许多类可以使用额外的帮助来支持"依赖注入"或扩展的策略设计.

如果你还没有阅读其他模块并且不确定你的monkeypatches是否正常工作......那么......我们仍然希望monkeypatches不会破坏任何东西.