问题标签 [monkeypatching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
626 浏览

python - Monkeypatching stdlib 方法是 Python 中的一个好习惯吗?

随着时间的推移,我发现需要重写stdlibPython 中的几个方法以克服限制或添加一些缺失的功能。

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

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

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

  • 您仍然调用原始方法,以确保更新原始模块时不会丢失任何内容
  • 您没有改变方法的原始“含义”

例子:

  • 为 python 日志记录模块添加着色支持
  • 使open()在使用文本模式时能够识别 Unicode BOM 掩码
  • 添加日志记录支持os.system()subprocess.Popen()- 让您输出到控制台或/并重定向到另一个文件。
  • 实现您的平台上缺少的方法,例如os.chown()Windowsos.lchown()上缺少的方法。

做这样的事情在我看来是体面的替代,但我想看看其他人是如何看待它们的,特别是什么应该被视为可接受的猴子补丁,什么不是。

0 投票
3 回答
297 浏览

python - 如何在 python 中获得指针类型行为

我想编写一个测试用例来测试功能列表。这是我想做的一个例子:

我想要实现的目标如下:
步骤 1)将我的本地方法变量分配给 method_list 中的每个项目
步骤 2)Monkeypatch 方法。在这个例子中,我使用了一个 mock.Mock 对象

实际发生的是:
步骤 1) 方法已成功分配给来自 method_list 的项目 - OK
步骤 2) 然后将方法分配给对象 Mock() - NOK

我在第 2 步中想要的是从 method_list 中获取项目,例如将 method1 分配给 Mock() 对象。最终结果是 method 和 method1 都指向同一个 Mock() 对象

我意识到我实际上在做的是 a = b
a = c
然后期待 c==b !

我想如果没有以某种方式获得指向 b 的指针,这实际上是不可能的?

0 投票
2 回答
336 浏览

f# - F# 模块可以打猴子补丁吗?

快速提问。我刚刚读到,如果您想向例如 List 模块添加一个函数,您可以使用该函数定义一个新的 List 模块:

这是否具有添加foo到主 List 模块的效果,或者您是否必须明确打开新的List?前者似乎是 Ruby 的“猴子补丁”;我猜后者更像是扩展方法。

(我会尝试一下,但我不在编译器附近。)

0 投票
4 回答
39553 浏览

python - 猴子补丁 Python 类

我有一个类,位于一个单独的模块中,我无法更改。

除了这个文件,这不会改变 MyClass 其他任何地方。但是,如果我要添加这样的方法

这将起作用,并且 foo 方法将在其他任何地方可用。

如何完全替换课程?

0 投票
1 回答
1761 浏览

python - 如何通过猴子补丁替换课程?

我怎样才能替换 ORM 类 - 所以它不应该导致递归!

问题
原始类有超级调用,当它被替换时 - 它会导致自继承并导致最大递归深度超过异常。
即类 orm 正在调用 super(orm, self).... 并且 orm 已被另一个继承原始 orm 的类取代....

包裹 !

orm.py 的内容

插件/ init .py的内容

addons/test.py 的内容

test_app1.py 的内容

run_app.py 的内容

输出

我看过类似的问题

0 投票
4 回答
7359 浏览

ruby-on-rails - 如何在 Ruby on Rails 中进行猴子补丁?

让我们使用一个真实世界的例子。

我想修补 WillPaginate::LinkRenderer.to_html 方法。

到目前为止,我已经尝试过:

  1. 在文件夹中创建了一个文件:lib/monkeys/will_paginate_nohtml.rb
  2. 在 config/environments.rb 中添加:文件末尾需要 'monkeys/will_paginate_nohtml'
  3. 在该文件中,这是我的代码:

e

但不知何故,调试器没有通过。看来补丁失败了。

任何帮助将不胜感激,谢谢!

0 投票
2 回答
2890 浏览

ruby - 我如何猴子补丁 ruby​​ 的 URI.parse 方法

一些流行的博客站点通常在其 URL 中使用方括号,但 ruby​​ 的内置 URI.parse() 方法会阻塞它们,引发一个令人讨厌的异常,如: http ://redmine.ruby-lang.org/issues/show/ 1466

我正在尝试编写一个简单的猴子补丁,可以优雅地处理带有方括号的 URL。以下是我到目前为止所拥有的:

但是在运行时,这会产生一个错误:

/Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/module/aliasing.rb:33:in alias_method: NameError: undefined method 'parse' for module 'URI'

我怎样才能成功地猴子补丁 URI.parse?

0 投票
1 回答
2088 浏览

python - 猴子修补 Django 表单类?

给定一个表单类(在你巨大的 Django 应用程序的深处)..

考虑到您想在不扩展或修改表单类本身的情况下向该表单添加另一个字段,为什么以下方法不起作用?

(我的第一个猜测是 Django 使用的元类hackery 仅在第一次构造表单类时应用。如果是这样,是否有办法重新声明该类来克服这个问题?)

0 投票
2 回答
713 浏览

ruby-on-rails - Rails 中的猴子补丁

猴子补丁是一种好的开发实践吗?我什么时候应该进行monkeypatch,而不是说,fork一个gem并在分叉的项目上制作补丁?

0 投票
2 回答
2352 浏览

ruby - 如何为 Ruby 编写猴子补丁?

我正在使用 Rails 3 并收到如下所示的错误:

我想monkeypatch来解决这个问题。首先:它应该是什么样子?我对 Ruby 源代码中的 Array 类的嵌套知之甚少。我会很感激指导。