仅在一个模块中修补方法

2024-04-18

例如,我有一些模块(foo.py)与下一个代码:

import requests

def get_ip():
    return requests.get('http://jsonip.com/').content

及模块bar.py具有类似的代码:

import requests

def get_fb():
    return requests.get('https://fb.com/').content

我只是不明白为什么接下来会发生:

from mock import patch

from foo import get_ip
from bar import get_fb

with patch('foo.requests.get'):
    print(get_ip())
    print(get_fb())

他们两个被嘲笑: <MagicMock name='get().content' id='4352254472'> <MagicMock name='get().content' id='4352254472'> 看来只能打补丁了foo.get_ip方法由于with patch('foo.requests.get'),但事实并非如此。 我知道我可以得到bar.get_fb呼唤出with范围,但有些情况下,我只在上下文管理器中运行一个调用许多其他方法的方法,并且我想修补requests仅在一个模块中。 有什么办法可以解决这个问题吗?不改变模块中的导入


两个地点foo.requests.get and bar.requests.get引用同一个对象,因此在一个地方模拟它,然后在另一个地方模拟它。

想象一下您如何实施补丁。您必须找到符号所在的位置并将该符号替换为模拟对象。退出 with 上下文时,您将需要恢复符号的原始值。像(未经测试)的东西:

class patch(object):
    def __init__(self, symbol):
        # separate path to container from name being mocked
        parts = symbol.split('.')
        self.path = '.'.join(parts[:-1]
        self.name = parts[-1]
    def __enter__(self):
        self.container = ... lookup object referred to by self.path ...
        self.save = getattr(self.container, name)
        setattr(self.container, name, MagicMock())
    def __exit__(self):
        setattr(self.container, name, self.save)

所以你的问题是你正在模拟请求模块中的对象,然后你从 foo 和 bar 引用该对象。


按照 @elethan 的建议,您可以模拟 foo 中的 requests 模块,甚至对 get 方法提供副作用:

from unittest import mock
import requests

from foo import get_ip
from bar import get_fb

def fake_get(*args, **kw):
    print("calling get with", args, kw)
    return mock.DEFAULT

replacement = mock.MagicMock(requests)
replacement.get = mock.Mock(requests.get, side_effect=fake_get, wraps=requests.get)
with mock.patch('foo.requests', new=replacement):
    print(get_ip())
    print(get_fb())

更直接的解决方案是改变您的代码,以便foo and bar将引用拉到get直接进入他们的名称空间。

foo.py:

from requests import get

def get_ip():
    return get('http://jsonip.com/').content

bar.py:

from requests import get

def get_ip():
    return get('https://fb.com/').content

main.py:

from mock import patch

from foo import get_ip
from bar import get_fb

with patch('foo.get'):
    print(get_ip())
    print(get_fb())

生产:

<MagicMock name='get().content' id='4350500992'>
b'<!DOCTYPE html>\n<html lang="en" id="facebook" ...

更新了更完整的解释,以及更好的解决方案(2016-10-15)

注:已添加wraps=requests.get在副作用发生后调用底层函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅在一个模块中修补方法 的相关文章

  • 如何在 Jupyter Notebook 中运行 Python 异步代码?

    我有一些 asyncio 代码在 Python 解释器 CPython 3 6 2 中运行良好 我现在想在具有 IPython 内核的 Jupyter 笔记本中运行它 我可以运行它 import asyncio asyncio get ev
  • 使用 Python 创建 MIDI

    本质上 我正在尝试从头开始创建 MIDI 并将它们放到网上 我对不同的语言持开放态度 但更喜欢使用Python 两种语言之一 如果这有什么区别的话 并且想知道我应该使用哪个库 提前致谢 看起来这就是您正在寻找的 适用于 Python 的简单
  • numpy python 中的“AttributeError:'matrix'对象没有属性'strftime'”错误

    我有一个维度为 72000 1 的矩阵 该矩阵涉及时间戳 我想使用 strftime 如下所示 strftime d m y 为了得到像这样的输出 11 03 02 我有这样一个矩阵 M np matrix timestamps 我使用了
  • Pyqt-如何因另一个组合框数据而更改组合框数据?

    我有一个表 有 4 列 这 4 列中的两列是关于功能的 一个是特征 另一个是子特征 在每一列中 所有单元格都有组合框 我可以在这些单元格中打开txt 我想 当我选择电影院作为功能时 我只想看到子功能组合框中的电影名称 而不是我的 数据 中的
  • Pandas dataframe:每批行的操作

    我有一个熊猫数据框df我想计算每批行的一些统计信息 例如 假设我有一个batch size 200000 对于每批batch sizerows 我想要一列的唯一值的数量ID我的数据框 我怎样才能做这样的事情呢 这是我想要的一个例子 prin
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • 小部件之间的自定义信号

    尝试将信号从一个 gtk EventBox 子级发送到另一个 在 init HeadMode 第 75 行 上出现错误 类型错误 未知信号名称 消息发送 why usr bin env python coding utf8 import p
  • 如何从下面的html中提取数据?

    我想要从中提取数据的 Html 是 div class infoMessageInner p span class ng binding Fiber r best lld till adressen Tj nsterna kan du be
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • Python问题:打开和关闭文件返回语法错误

    大家好 我发现了这个有用的 python 脚本 它允许我从网站获取一些天气数据 我将创建一个文件和其中的数据集 有些东西不起作用 它返回此错误 File
  • 如何在PIL中从ImageDraw中获取图像?

    我在我的项目中使用 PIL 并且有 ImageDraw 对象 我想获取在 ImageDraw 对象上绘制的图像 我如何获取图像 这是你想要的 from PIL import Image ImageDraw im Image new RGBA
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • 操作错误:(sqlite3.OperationalError) SQL 变量太多,同时将 SQL 与数据帧一起使用

    我有一个熊猫数据框 如下所示 activity User Id 0 VIEWED MOVIE 158d292ec18a49 1 VIEWED MOVIE 158d292ec18a49 2 VIEWED MOVIE 158d292ec18a4
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo

随机推荐

  • 从ACRA 4.5升级到ACRA 4.6后编译错误

    我将我的应用程序使用的 ACRA 库从 4 5 0 到 4 6 0 但我收到 formKey 的编译错误 以前可以与 4 5 一起使用 以下是声明 ReportsCrashes formKey formUri socketTimeout 1
  • 根据另一个数组的数据对 numpy 数组进行排序

    我有两组数组data and result result包含相同的元素data但有一个额外的列并且按未排序的顺序 我想重新安排result数组 使其与中的行顺序相同data 同时在排序时将关联值与该行的其余部分一起放入最后一列 data n
  • 使用 Google Apps 脚本批量导入多个条目

    我知道有现有的代码可以构建可以上传多个文件 批量导入 的表单 如下所示使用 Google App 脚本将多个文件上传到 Google Drive https stackoverflow com questions 31126181 uplo
  • requireJS 与文件上传插件

    在requirejs中 我们可以通过以下方式设置js的名称 requirejs config paths jquery cdnjs cloudflare com ajax libs jquery 2 1 0 jquery min js 并将
  • 捕获 UserControl 中的 KeyDown 事件

    我有一个带有多个子控件的用户控件 我需要用户界面对按键做出反应 因此我决定将处理代码放入 MainControl KeyDown 事件中 但是 当我在应用程序中按下某个键时 该事件不会触发 我通过搜索引擎找到了一个依赖于使用 Windows
  • Ajax jquery 异步返回值

    我怎样才能让这段代码返回值无需冻结浏览器 当然 您可以用新方法重写它 function get char val merk var returnValue null ajax type POST async false url char i
  • js 异步/等待不工作

    我正在尝试了解 async await 以及如何使用它们 我正在遵循一些我见过的例子 我认为 但等待实际上并不是在等待ajax响应 这是代码 async function doAjaxGet ajaxurl const result awa
  • 在ggplot2中水平均匀分布点

    我想绘制计数的垂直箱线图 并将计数显示为点 覆盖在箱线图上 因为它们是离散值 所以会有多个点具有相同的值 为了在 ggplot2 中显示数据 我可以使用 geom jitter 来传播数据并获得稍微好一点的印象 但是抖动会破坏值 垂直分量
  • MySQL插入查询优化

    将大量行插入表中时 以下两种方法中哪一种会更快 查询方法一 逐条执行查询 INSERT INTO tbl user id name number VALUES NULL A 9999999999 INSERT INTO tbl user i
  • 更精确的 distance_of_time_in_words

    distance of time in words很棒 但有时不够精细 我需要一个能够以文字报告准确时间距离的函数 例如 上午 7 50 到上午 10 10 的距离应该是 2 小时 20 分钟 而不是 大约 2 小时 或其他什么distan
  • HighChart:多个图表的绘图线单击事件

    我正在使用 highchart 来实现一些向下钻取功能 我有一个功能可以让用户单击面积图并添加一条线 但后来我发现我的函数有一个错误 这些图表之间应该只有一条红线 但是当用户单击另一个图表时 第一个图表上的现有红线不会被删除 以下是我分享的
  • 如何将jupyter笔记本目录中的模块导入到较低目录的笔记本中? [复制]

    这个问题在这里已经有答案了 我使用 Jupyter Notebook 进行数据分析已经有一段时间了 我想在我的 jupyter 笔记本目录中开发一个模块 并能够将该新模块导入到笔记本中 我的jupyter笔记本文件目录可以表示如下 Jupy
  • dataframe.transpose() 没有转置

    我有一个数据框 df5 我想将列转置为行 反之亦然 DayofWeek Avg Shopping Trips Avg Profit 0 5 Saturday 1096 750000 185040 397500 1 6 Sunday 1489
  • Java 6 中的 xerces 序列化

    在 Java 6 中 整个 xerces XML 解析器 序列化器实现现在位于 Java 运行时 rt jar 中 这些包已移至 com sun 命名空间下 这使得它们无法在客户端代码中进行显式引用 使用解析器时这不是问题 解析器是通过 j
  • 为什么 Assert.AreEqual(T obj1, Tobj2) 对于相同的对象会失败

    我有一个包含多个结构的类 public class NavigationMenu public struct NavigationMenuItem public bool Enabled get set public int NumberO
  • Keras:实际使用的 GPU 内存量

    我正在使用带有 Tensorflow 后端的 Keras 并查看nvidia smi不足以了解当前网络架构需要多少内存 因为 Tensorflow 似乎只是分配所有可用内存 那么问题是如何找出真实的GPU内存使用情况 这可以使用时间轴来完成
  • java.lang.NoClassDefFoundError:freemarker/template/TemplateModelException

    尝试打造先进HTML报告使用extentReportsjar 但它抛出以下错误 java lang NoClassDefFoundError freemarker 模板 TemplateModelException Code public
  • 如何从另一个sh文件运行sh文件

    我有一个用于监视我的应用程序的 shell 脚本文件 该脚本将通过设置 cron 作业每 10 分钟执行一次 我想更多一些与监控相关的脚本文件应该与主文件一起执行 所以我想将我的脚本包含到主文件中 如何从主 sh 文件运行这些 sh 文件
  • 如何在Windows8应用程序中使用ReadTextAsync(StorageFile file)同步获取返回值

    基本上 我的代码是一个非常简单的测试 用于在 Windows 8 风格的应用程序中写入和读取文件 这里 首先将字符串 Jessie 写入dataFile txt 然后由程序读取它 以便更新xaml中Textblock的Text属性 从msd
  • 仅在一个模块中修补方法

    例如 我有一些模块 foo py 与下一个代码 import requests def get ip return requests get http jsonip com content 及模块bar py具有类似的代码 import r