python 中的猴子修补:什么时候我们需要它?

2023-12-14

在 Python 中,术语monkey patch仅指在运行时动态修改类或模块,作为初学者,我很难在 python 上下文中理解这个术语。有人能用一个现实世界的例子向我解释一下我们到底是怎么做的吗?

  1. 类的动态修改
  2. 运行时动态修改模块

我坚持用一个现实世界的例子(尽可能简单)来理解在哪些场景下我们必须执行这样的任务?


猴子修补是一种进行全局底层更改的方法,现有代码将继续运行,但行为会发生变化。

改变内置行为的一个非常非常简单的例子str命令:

b.py

def foo(msg):
    s = str(msg)
    print s, type(s)

a.py

import b

b.foo('foo')

# monkey-patch 
import __builtin__
__builtin__.str = unicode

b.foo('foo')

# Results:
#foo <type 'str'>
#foo <type 'unicode'>

The a模块使用以下命令修改了其他代码的行为str命令,通过修补它来使用unicode反而。这是必要的,因为我们假装我们无法访问b.py的代码。它可能是一个巨大的包,我们只是使用并且无法更改。但是我们可以插入要调用的新代码来改变行为。

一个现实世界的例子来自 格事件

>>> import gevent
>>> from gevent import socket
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>> gevent.joinall(jobs, timeout=2)
>>> [job.value for job in jobs]
['74.125.79.106', '208.77.188.166', '82.94.164.162']  

上面的示例使用 gevent.socket 进行套接字操作。如果 如果使用标准插座模块,则需要花费 3 倍的时间才能完成 完整的,因为 DNS 请求是连续的。使用 greenlets 内的标准套接字模块使 gevent 毫无意义, 那么构建在套接字之上的模块和包又如何呢?

这就是猴子修补的目的。 gevent.monkey 中的函数 仔细替换标准套接字模块中的函数和类 与他们的合作伙伴。这样即使模块 不知道 gevent 可以从在 multi-greenlet 中运行中受益 环境。

>>> from gevent import monkey; monkey.patch_socket()
>>> import urllib2 # it's usable from multiple greenlets now
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中的猴子修补:什么时候我们需要它? 的相关文章

  • 错误:process_executor.py:702: ... 当一些作业被分配给执行器时,工作人员停止了。这可能是由于工作超时太短造成的

    根据主题中的错误 修复方法是什么 环境 Python 3 9 或 3 10 Windows 10 x64 使用时出现错误joblib https joblib readthedocs io en latest 对于并行处理 result c
  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 在Python上获取字典的前x个元素

    我是Python的新手 所以我尝试用Python获取字典的前50个元素 我有一本字典 它按值降序排列 k 0 l 0 for k in len dict d l 1 if l lt 51 print dict 举个小例子 dict d m
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • python 中的 <> 运算符有什么作用?

    我刚刚遇到这个here http www feedparser org feedparser py 总是这样使用 if string1 find string2 lt gt 1 pass 什么是 lt gt 运算符这样做 为什么不使用通常的
  • 两个不同长度的数据帧的列之间的余弦相似度?

    我在 df1 中有文本列 在 df2 中有文本列 df2 的长度将与 df1 的长度不同 我想计算 df1 text 中每个条目与 df2 text 中每个条目的余弦相似度 并为每场比赛给出分数 输入样本 df1 mahesh suresh
  • Plotly:如何检查基本图形结构(版本 4)

    对于旧版本的plotly 例如在 Jupyterlab 中 您可以简单地运行figure像这样检查你的图形的基础知识 Ouput data marker color red size 10 symbol 104 mode markers l
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • 如何在 C# 中将正则表达式设置为 MaskedTextBox 的掩码?

    我想从正则表达式设置 MaskedtextBox 的掩码 例如我想要针对 MaskedtextBox 的有效电子邮件 十进制值和其他正则表达式 作为参考 这描述了您可以使用面罩做什么 http msdn microsoft com en u
  • 使用 AppAssertionCredentials 来自 Google Admin SDK 的 403 错误

    我正在尝试通过 Google 管理目录 API 列出用户 import logging import os from google appengine api import memcache from googleapiclient imp
  • 如何禁用 Rails 应用程序中的迁移功能?

    背景 我们分别设计数据库模型和应用程序模型 RDMBS 架构师与 OOP 工程师 从我对 Rails 与域 键范式的了解来看 Rails 迁移无法轻松复制精心设计的企业 RDBMS 的所有功能 如果有的话 因此我们不进行迁移 而是使用其他工
  • LINQ to Entities 在 SQL 2005 Express 上生成包含 datetime2 的查询

    我有一个 LINQ to Entities 应用程序和一个数据库项目来管理面向 NET 4 0 的 VS 2010 解决方案中的架构 实体模型目前是从数据库进行逆向工程的 其中一个表是用日期时间类型的列定义的 数据库项目配置为使用 SQL
  • 为什么 R 中的回归会删除因子变量的索引 1? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 R 进行回归lm和glm功能 我的因变量是基于给定时间段内事件与非事件比例的对数转换数据 所以我的因变量是连续的 而我的自变量是因子变量或虚拟变量 我有两个自变量 可以取以下值 i 年到 m 年
  • Android 后台服务在滑出时崩溃

    当我从任务管理器中删除我的应用程序时 剩下 0 个进程和 1 个服务 应用程序一次又一次崩溃 我应该做什么来解决它 这是我的服务等级 我还想问一件事OnStart 方法和OnStartCommand 方法之间的区别 package com
  • 在 JavaScript“窗口”对象中存储变量是使用该对象的正确方法吗?

    也许 我刚刚解决了我的问题 从对话框窗口成功提交表单后如何更新前端内容 通过在 JavaScript 中 存储 保存 变量window目的 然而 由于我是 JavaScript 方面的新手 我对是否在 JavaScript 中存储 保存变量
  • mysql 如果存在

    我已经盯着这个看了有一段时间了 也许一些新的眼睛能够指出我做错了什么 这是我的查询 IF EXISTS SELECT FROM admin rule module WHERE rule set id 13 AND entity id 2 b
  • 使用应用程序访问令牌时,Android 中的 OAUTH 访问令牌无效

    正如标题所示 当我尝试请求获取安装了该字段的好友列表时 me friends Fields installed access token 我的 logcat 中出现以下错误 Invalid OAuth access token 当查看 fa
  • SSIS包通过部署升级

    在我们的 QA 虚拟环境中 其中包含多个 SQL Server 我想部署一个通过 Visual Studio 2010 维护的 SSIS 2012 包 ispac 项目部署 目标 SSIS 服务器是 2012 但工作站上的客户端包括 SQL
  • php 邮件重复

    有什么原因会导致重复发送电子邮件吗 我有一个 PHP 页面 上面只有这段代码 每次运行它时 它都会向我发送两封电子邮件 感谢您的意见 事实证明这是一个浏览器插件问题 特别是 Firefox 4 0 1 上的 ySlow 2 1 0 我要求我
  • 在 FileZilla 中下载文件的命令行选项

    我正在使用 FileZilla GUI 从 FTP 服务器下载文件 谁能告诉我一个从 FTP 服务器下载文件到本地文件系统的命令行参数 FileZilla 没有任何允许自动传输的命令行参数 也没有任何其他方式 See FileZilla 客
  • 如何在 Google Maps API V3 中检索英文结果

    directionsDisplay new google maps DirectionsRenderer directionsDisplay setMap map directionsService new google maps Dire
  • 对 pandas 数据集执行 SQL 查询

    我有一个 pandas 数据集 称为 df 我怎样才能做类似下面的事情 df query select from df 谢谢 对于那些了解 R 的人 有一个名为 sqldf 的库 您可以在 R 中执行 SQL 代码 我的问题基本上是 pyt
  • 获取不带查询字符串的 url

    我有一个像这样的网址 http www example com mypage aspx myvalue1 hello myvalue2 goodbye 我想要得到http www example com mypage aspx从中 你能告诉
  • JQuery load() 和 .prepend()

    好的 我有以下代码 function ul postbit load load php fadeIn slow 3000 我想要实现的是加载 load php 之后将结果添加到 li 并让它淡入 此时它会覆盖其中的内容ul postbit
  • 未经身份验证的使用超出了 Google Api 日历的每日限制

    我正在测试示例代码 它一直有效 但突然我得到 error errors domain usageLimits reason dailyLimitExceededUnreg message Daily Limit for Unauthenti
  • Windows 不会从所有接口接收多播 IPv6 数据包

    我正在尝试使用此 python 2 7 代码在 Windows 上接收 IPv6 多播数据包 发送到 ff02 1 地址 import socket import win inet pton import struct socket IPP
  • 在java中添加一个简单的按钮,但java不允许我这样做

    好吧 从我的角度来看 我的代码相当不错 足以获得及格分数 但我在添加简单的刷新 随机播放按钮时遇到了麻烦 不使用 JOptionPane 的帮助 Eclipse 似乎没有意识到我创建了一个按钮 这对我来说根本没有意义 因为它告诉我一些关于节
  • python 中的猴子修补:什么时候我们需要它?

    在 Python 中 术语monkey patch仅指在运行时动态修改类或模块 作为初学者 我很难在 python 上下文中理解这个术语 有人能用一个现实世界的例子向我解释一下我们到底是怎么做的吗 类的动态修改 运行时动态修改模块 我坚持用