当前位置: 首页 > 面试题库 >

monkey如何修补python中的功能?

单于正业
2023-03-14
问题内容

我在用另一个功能替换另一个模块中的功能时遇到麻烦,这让我发疯。

假设我有一个看起来像这样的模块bar.py:

from a_package.baz import do_something_expensive

def a_function():
    print do_something_expensive()

我还有另一个看起来像这样的模块:

from bar import a_function
a_function()

from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
a_function()

import a_package.baz
a_package.baz.do_something_expensive = lambda: 'Something really cheap.'
a_function()

我希望得到结果:

Something expensive!
Something really cheap.
Something really cheap.

但是我得到了这个:

Something expensive!
Something expensive!
Something expensive!

我究竟做错了什么?


问题答案:

考虑一下Python名称空间的工作原理可能会有所帮助:它们实际上是字典。因此,当您执行此操作时:

from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'

这样想:

do_something_expensive = a_package.baz['do_something_expensive']
do_something_expensive = lambda: 'Something really cheap.'

希望您能明白为什么它不起作用:-)将名称导入名称空间后, 从中
导入名称空间的名称值就无关紧要了。您仅在本地模块的名称空间或上面的a_package.baz的名称空间中修改do_something_expensive的值。但是因为bar直接导入do_something_expensive,而不是从模块名称空间引用它,所以需要写入其名称空间:

import bar
bar.do_something_expensive = lambda: 'Something really cheap.'


 类似资料:
  • 问题内容: 我遇到了有关monkey修补Django的帖子: 我知道这不是理想的选择,最好User通过单独的模型添加字段和函数Profile。 话虽如此,我只想了解这是如何工作的: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会syncdb“知道”是否已添加新字段吗?如果没有

  • 问题内容: 我知道,如果go代码的结构使其可以编程为接口,那么模拟起来就很简单了。但是,我正在使用无法更改的代码库(不是我的),情况并非如此。 该代码库是高度互连的,并且仅对结构进行编程,而没有对接口进行编程,因此没有依赖项注入。 这些结构本身仅包含其他结构,因此我也无法以这种方式进行模拟。我不相信我可以对方法做任何事情,并且存在的少数几个函数不是变量,所以我不知道如何将它们换出。继承在golan

  • 问题内容: 我正在使用其他人编写的模块。我想猴子修补模块中定义的类的方法。我发现的示例显示了如何执行此操作的所有示例均假设我自己将自己称为该类(例如Monkey-patch Python类)。然而,这种情况并非如此。在我的情况下,该类是在另一个模块的函数中初始化的。请参阅下面的(大大简化的)示例: thirdpartymodule_a.py thirdpartymodule_b.py mymodu

  • 本文向大家介绍python 猴子补丁(monkey patch),包括了python 猴子补丁(monkey patch)的使用技巧和注意事项,需要的朋友参考一下 写了一段时间java切回写python偶尔会出现一些小麻烦,比如:在java中自定义对象变成json串很简单,调用一个方法就行,但同样的转换在python中却不太容易实现。在寻找python自定义对象转json串的过程中,接触到了猴子补

  • 问题内容: 我需要测试使用的功能。最简单的方法是什么? 问题答案: 您需要monkeypatch datetime.now函数。在下面的示例中,我正在创建固定装置,以后可以在其他测试中重复使用:

  • 问题内容: 我遇到了有关猴子修补Django的帖子: 我知道这不是理想的选择,最好通过单独的模型添加字段和函数。 话虽如此,我只想了解这将如何工作: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会“知道”是否已添加新字段吗?如果没有,如何更改架构? 问题答案: 您可以将其放置