jjzjj

monkeypatching

全部标签

python - 一只猴子如何在 python 中修补一个函数?

我在用另一个函数替换来自不同模块的函数时遇到问题,这让我发疯。假设我有一个如下所示的模块bar.py:froma_package.bazimportdo_something_expensivedefa_function():printdo_something_expensive()我还有另一个看起来像这样的模块:frombarimporta_functiona_function()froma_package.bazimportdo_something_expensivedo_something_expensive=lambda:'Somethingreallycheap.'a_func

python - 一只猴子如何在 python 中修补一个函数?

我在用另一个函数替换来自不同模块的函数时遇到问题,这让我发疯。假设我有一个如下所示的模块bar.py:froma_package.bazimportdo_something_expensivedefa_function():printdo_something_expensive()我还有另一个看起来像这样的模块:frombarimporta_functiona_function()froma_package.bazimportdo_something_expensivedo_something_expensive=lambda:'Somethingreallycheap.'a_func

java - 是否可以在 Java 中进行猴子补丁?

我不想讨论这种方法的优点,只要可能。我相信答案是“不”。但也许有人会让我大吃一惊!假设您有一个核心小部件类。它有一个方法calculateHeight(),返回一个高度。高度太大-这导致按钮(比如说)太大。您可以扩展DefaultWidget来创建自己的NiceWidget,并实现自己的calculateHeight()以返回更好的尺寸。现在是一个库类WindowDisplayFactory,以相当复杂的方法实例化DefaultWidget。您希望它使用您的NiceWidget。工厂类的方法如下所示:publicIWidgetcreateView(Componentparent){De

java - 是否可以在 Java 中进行猴子补丁?

我不想讨论这种方法的优点,只要可能。我相信答案是“不”。但也许有人会让我大吃一惊!假设您有一个核心小部件类。它有一个方法calculateHeight(),返回一个高度。高度太大-这导致按钮(比如说)太大。您可以扩展DefaultWidget来创建自己的NiceWidget,并实现自己的calculateHeight()以返回更好的尺寸。现在是一个库类WindowDisplayFactory,以相当复杂的方法实例化DefaultWidget。您希望它使用您的NiceWidget。工厂类的方法如下所示:publicIWidgetcreateView(Componentparent){De

python - Pytest monkeypatch 不适用于导入的函数

假设一个项目中有两个包:some_package和another_package。#some_package/foo.py:defbar():print('hello')#another_package/function.pyfromsome_package.fooimportbardefcall_bar():#...code...bar()#...code...我想测试another_package.function.call_bar模拟出some_package.foo.bar因为它有一些我想避免的网络I/O。这是一个测试:#tests/test_bar.pyfromanother

python - 为什么 python 的 monkeypatch 在导入类而不是模块时不起作用?

我在使用已接受答案的代码时遇到问题here.代码的工作取决于我如何导入日期时间。这是为什么呢?是否可以模拟它以使其双向工作?我正在使用Python3.4。下面的代码说明了这个问题:importpytestfromdatetimeimportdatetimemockdate=datetime(2000,1,1,0,0,0)@pytest.fixture(autouse=True)defpatch_datetime_now(monkeypatch):classmydatetime:@classmethoddefnow(cls):returnmockdatemonkeypatch.setat

php - 是否可以替换 (monkeypatch) PHP 函数?

您可以在Python中执行此操作,但在PHP中是否可行?>>>defa():print1...>>>defa():print2...>>>a()2例如:Fatalerror:Cannotredeclarevar_dump()in/tmp/-online1 最佳答案 这有点,但我只想指出,从PHP5.3开始,实际上可以在不使用PHP扩展的情况下覆盖内部函数。诀窍在于您可以在命名空间内重新定义内部PHP函数。它基于PHP对函数进行名称解析的方式:在命名空间(例如A\B)内,对非限定函数的调用在运行时解析。以下是对函数foo()的调用是如

ruby - 为什么 monkeypatching Hash.new 不起作用?

我正在修补Ruby的Hash类。classHashalias_method:_initialize,:initializedefinitializeputs'Inmyhashclass'_initializeendend当我这样做Hash.new它按预期工作。但是假设我有一个接受Hash的函数。类似的东西,foo'a'=>'b'在这种情况下,我的Hash类没有被使用。我希望我的Hash类的initialize方法被调用。为什么会这样? 最佳答案 因为文字哈希不会调用Hash.new将调用的initialize方法。与Hash['a'

ruby - 如何在 Ruby 中实现安全、向后兼容的 "reverse-monkeypatch"?

如果你的同事在Ruby中“打开”(“monkeypatches”)一个类并重新定义了一些你需要使用的重要功能,你如何访问原始的pre-monkeypatched功能而不破坏已经依赖/依赖于的系统他的monkeypatched定义? 最佳答案 给定方法重写的例子,如果你能在他的猴子补丁加载之前加载一些代码,那么你可以为该方法起别名。classFixnumalias_method:original_plus,:+endclassFixnumdef+(x)self-xendend>>5+3=>2>>5.original_plus(3)=>

ruby - 如何编写将对其进行修改的 String monkeypatch 方法

我想通过提供shuffle和shuffle!方法来修改Ruby的String类。classStringdefshuffleself.split('').shuffle.joinendend它返回一个新的字符串。我如何编写一个shuffle!方法来修改字符串而不是返回副本?我试图自己弄清楚,但String的源代码在MRI中是C语言。 最佳答案 你不能赋值给self,这可能是第一个想到的。但是,有一个方便的方法String#replace,您知道,它会替换字符串的内容。classStringdefshufflesplit('').shu