pytest - Monkeypatch 关键字参数默认值

2024-01-03

我想测试函数的默认行为。我有以下内容:

# app/foo.py
DEFAULT_VALUE = 'hello'

def bar(text=DEFAULT_VALUE):
    print(text)
# test/test_app.py
import app

def test_app(monkeypatch):
    monkeypatch.setattr('app.foo.DEFAULT_VALUE', 'patched')
    app.foo.bar()
    assert 0

输出是hello;不是我想要的。

一种解决方案是显式传递默认值:app.foo.bar(text=app.foo.DEFAULT_VALUE).

但我发现有趣的是,当默认为全局范围时,这似乎不是问题:

# app/foo.py
DEFAULT_VALUE = 'hello'

def bar():
    print(DEFAULT_VALUE)

输出是patched.

为什么会发生这种情况?还有比显式传递默认值更好的解决方案吗?


函数默认值绑定在函数定义时间.

当您进入测试代码时,定义该函数的模块已经被导入,并且通过在模块级别常量上进行猴子修补来交换默认值已经太晚了。这个名字已经被解决了。

解决方法是像这样定义函数:

def bar(text=None):
    if text is None:
        text = DEFAULT_VALUE
    print(text)

现在在函数中查找默认值call时间,这意味着模块级别默认的猴子补丁仍然可以工作。

如果您不喜欢修改函数定义,那么您可以对函数对象本身进行 Monkeypatch:

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

pytest - Monkeypatch 关键字参数默认值 的相关文章

  • 如何使用curl将文件上传到Atlassian Confluence页面

    我正在尝试按照远程 API 文档中给出的指南将 xls 文件上传到 Confluence wiki 页面 https developer atlassian com confdev confluence server rest api co
  • 帮助需要在可选条件下编写正则表达式[关闭]

    我有一个日志文件包含如下内容 log Using data from yyyy mm dd 2011 8 3 0 files queued for scanning Warning E test H ndler pdf File not F
  • Pip install 导致此错误“ cl.exe' failed with exit code 2 ”

    我已经阅读了有关此错误的所有其他问题 但令人沮丧的是 没有一个给出有效的解决方案 如果我跑pip install sentencepiece在命令行中 它给出了以下输出 src sentencepiece sentencepiece wra
  • 有条件填写 pandas 数据框

    我有一个数据框df列中包含浮点值A 我想添加另一列B这样 B 0 A 0 for i gt 0 B i if np isnan A i then A i else Step3 B i if abs B i 1 A i B i 1 lt 0
  • Python 使用 M2Crypto 通过 S/MIME 对消息进行签名

    我现在花了几个小时 但找不到我的错误 我想要一个简单的例程来创建 S MIME 签名消息 稍后可以与 smtplib 一起使用 这是我到目前为止所拥有的 usr bin python2 7 coding utf 8 from future
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 使用字母而不是数字进行顺序计数[重复]

    这个问题在这里已经有答案了 我需要一种方法 将字符串 递增 到 z 然后将 aa 递增到 az 然后将 ba 递增到 bz 依此类推 就像 Excel 工作表中的列一样 我将向该方法提供前一个字符串 它应该增加到下一个字母 PSEUDO C
  • 可移植的非关系数据库

    我想尝试 尝试非关系数据库 最好的解决方案是 便携式 这意味着它不需要安装 理想情况下 只需将目录复制粘贴到某个地方即可使其工作 我不介意第一次使用时是否需要编辑一些配置文件或运行配置工具 可从 python 访问 适用于 Windows
  • 对图像使用 Pixellib 自定义训练时出现 input_image 元形状错误

    我正在使用 Pixellib 来训练自定义图像实例分割 我创建了一个数据集 可以在下面的链接中看到 数据集 https drive google com drive folders 1MjpDNZtzGRNxEtCDcTmrjUuB1ics
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • 当 DetailView 遇到时更新模型字段。 [姜戈]

    我有一个类似的 DetailViewviews py views py class CustomView DetailView context object name content model models AppModel templa
  • 提交表格并上传带有请求的文件

    我正在努力提交特定的表格蟒蛇请求 http www python requests org 我想使用它的网站上的其他表单工作正常 我可以提交登录表单等 这只是我遇到问题的文件上传 显然 提交表单效果很好 因为我从网站收到一条消息 说 请返回
  • Floyd-Warshall 算法:获取最短路径

    假设一个图由一个表示n x n维数邻接矩阵 我知道如何获得所有对的最短路径矩阵 但我想知道有没有办法追踪所有最短路径 Blow是python代码实现 v len graph for k in range 0 v for i in range
  • Python 垃圾收集有时在 Jupyter Notebook 中不起作用

    我的一些 Jupyter 笔记本经常出现 RAM 不足的情况 而且我似乎无法释放不再需要的内存 这是一个例子 import gc thing Thing result thing do something thing None gc col
  • 有没有任何方法可以使用 openpyxl 获取 .xlsx 工作表中存在的行数和列数?

    有没有任何方法可以使用 openpyxl 获取 xlsx 工作表中存在的行数和列数 在xlrd中 sheet ncols sheet nrows 将给出列数和行数 openpyxl中有这样的方法吗 给定一个变量sheet 可以通过以下方式之
  • 如何使用数据库在 Django 中的应用程序之间交换数据?

    我正在使用 Django 在网络上工作 我创建了 2 个应用程序 第一个用于客户端注册并将其数据添加到数据库 第二个应用程序供用户访问和查看交互界面 这个想法是使用第二个应用程序从数据库中的客户端获取数据 并使用它向用户显示一些信息 我的问
  • 向量化 numpy bincount

    我有一个 2d numpy 数组 A我要申请np bincount 到矩阵的每一列A生成另一个二维数组B由原始矩阵每列的 bincounts 组成A 我的问题是 np bincount 是一个采用一维数组的函数 它不是像这样的数组方法B A
  • 从 Python 中编译的正则表达式中提取命名组正则表达式模式

    我有一个 Python 正则表达式 其中包含多个命名组 但是 如果先前的组已匹配 则可能会错过与一组匹配的模式 因为似乎不允许重叠 举个例子 import re myText sgasgAAAaoasgosaegnsBBBausgisego
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • Jinja2中获取请求参数

    如何检索请求参数a在 Jinja2 模板中 http foo bar a 1 我这个答案有点晚了 但其他解决方案并没有真正考虑到您对 Flask 的使用 事实上 您将 Flask 与 Jinja2 一起使用 这使得您的情况与其他框架有点不同

随机推荐

  • Facebook 身份验证对话框(JS SDK)返回空白屏幕

    我正在设置一个 Rails 应用程序并尝试通过 Facebook JS SDK 实现登录 已经缺少 Omniauth 无论如何 发生的情况是弹出对话框 用户提供登录信息 但随后它重定向到https www facebook com conn
  • 如何使用服务帐户访问 GSuite 电子邮件帐户的 GMAIL API

    我希望我的服务帐户能够模拟 GSuite 中的用户之一 我有 通过 GCP 创建项目 在项目中启用GMail API 向该项目添加了一个服务帐户 启用了domain wide delegation在服务帐户设置中GCP 添加了一个API C
  • .Net 中的缓存和 WebBrowser 控件

    我正在使用 Net 中的 WebBrowser 控件来执行一些第三方联属营销转换 我在数据库中有一个队列表 其中包含要执行的所有脚本 图像 我使用 WebBrowser 控件在 WinForms 应用程序中循环遍历所有这些内容 执行脚本 图
  • 使用 bash 命令结果设置 ant 属性

    我怎样才能设置antproperty 的值是 bash 脚本执行的结果 例如 我需要有一个利用的目标svn and bash实用程序以控制构建执行 更具体地说 我尝试创建的目标将用于定义通过命令部署的应用程序中是否有修改的文件 svn st
  • 使用 auto 的模板函数重载解析

    具有以下 3 个重载 template
  • 将 UITableView 滑动到屏幕上,继续滑动?

    我想要一个从屏幕外开始并可以在屏幕上滚动 到达顶部并继续滚动的表格视图 我在下面制作了所需交互的视觉效果 我尝试过两件事 但都没有完全按照我的需要工作 我做的第一件事是将表视图放入滚动视图中 并在表视图上检测到平移时移动滚动视图 这会阻止桌
  • Parsley.js - 仅验证数字的可选输入

    我有一个表单 其中有 1 个可选输入和 3 个必填输入字段 对于可选输入 我有以下标记
  • 在 Meteor 中配置 Iron 路由器 - React

    使用 Meteor 1 2 0 1 和 React 我的简单应用程序运行良好 但现在我需要铁路由器 https github com iron meteor iron router 应用程序布局 client app jsx lib rou
  • Emmet - 带缩写的换行 - 表示换行文本的令牌,即{原始文本}

    我正在尝试尽可能惰性地将 URL 列表转换为 HTML 链接 www annaandsally com au www babylush com au www babysgotstyle com au etc 使用缩写形式的wrapper 我
  • WebWorkers 的执行速度似乎比主线程慢得多

    我一直致力于优化一些长时间运行的 JAvaScript 并尝试实现 WebWorkers 我有一组独立的任务需要计算 在我最初的测试中 有 80 个任务 在主线程上完成需要 250 毫秒 我认为我可以将任务分配给一些网络工作人员 并将时间缩
  • Hibernate 中的枚举

    在 DAO 中拥有一个其值来自 Java 枚举的字段通常很有用 一个典型的示例是登录 DAO 其中通常有一个将用户特征描述为 NORMAL 或 ADMIN 的字段 在 Hibernate 中 我将使用以下 2 个对象以 半 类型安全的方式表
  • C++ 实验/文件系统remove_all

    我想删除 C 17 中包含子文件夹和文件的文件夹 我在用着experimental filesystem namespace filesys std experimental filesystem uintmax t n filesys r
  • 在Android 8.1中访问WallpaperManager

    我正在构建一个启动器 需要访问用户当前的背景壁纸 但每次启动应用程序时都会收到警告W WallpaperManager No permission to access wallpaper suppressing exception to a
  • SaveChanges() 实体框架 4.1 的问题

    我在保存对数据库的更改时遇到问题 我正在控制器中更新模型 A 但是当我使用 SaveChanges 保存更改时 我最终在 B 的数据库中出现了重复的项目 调用 UpdateModel 后 我检查了 Bs 属性 它正如我所预期的那样 但是在调
  • 使用 supertest、express 和 mocha 进行 Grunt 测试 api

    我有一个由express运行的https服务器 我使用mocha和supertest对其进行测试 我的问题是 如果我只运行测试 就可以了 如果我尝试使用 test 运行 gruntfile 然后运行 express 我会看到很多 EADDR
  • 如何让按钮文本在 IE 中顶部对齐?

    我在按钮内有一些文本 我希望该文本在按钮顶部对齐 默认情况下 它似乎与中间对齐 在 webkit 中 我可以使用 webkit box align start 将此文本对齐到顶部这似乎不适用于 IE 例子 http jsfiddle net
  • 如何从具有 EXCEPTION 效果的 PureScript 函数返回值?

    我刚刚开始学习 PureScript 效果 并且一直在尝试创建一个具有 EXCEPTION 效果的函数 lengthGt5 forall eff String gt Eff err EXCEPTION eff String lengthGt
  • kubectl 端口转发是否加密?

    在运行 kubectl port forward 命令时 我找不到任何有关集群 pod 和 locahost 之间的连接创建被加密的信息 看起来它使用的是 socat https linux die net man 1 socat 支持加密
  • 是否有一种可以容忍微小差异的哈希算法?

    我正在做一些网络爬行类型的工作 在网页中查找某些术语并找到它们在页面上的位置 然后将其缓存以供以后使用 我希望能够定期检查页面是否有任何重大更改 像 md5 这样的东西可以通过简单地将当前日期和时间放在页面上来阻止 有没有适用于这样的事情的
  • pytest - Monkeypatch 关键字参数默认值

    我想测试函数的默认行为 我有以下内容 app foo py DEFAULT VALUE hello def bar text DEFAULT VALUE print text test test app py import app def