大神写Python时,也需要猴子请来的“补丁”

为什么叫猴子补丁?

猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的写成了gorllia(猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。



还有种说法是由于这种方式将原来的代码弄乱了(messing with it),在英文里叫monkeying about(顽皮的),所以叫做Monkey Patch(猴子补丁)。

程序中对猴子补丁的解释

猴子补丁指在运行时动态改变类或模块,为的是将第三方代码打补丁在不按预期运行的bug或者feature上 。

在运行时动态修改模块、类或函数,通常是添加功能或修正缺陷。猴子补丁在代码运行时内存中发挥作用,不会修改源码,因此只对当前运行的程序实例有效。

因为猴子补丁破坏了封装,而且容易导致程序与补丁代码的实现细节紧密耦合,所以被视为临时的变通方案,不是集成代码的推荐方式。

代码解释

我假装有一个翻译员的模块,它能使用各种语言print出“你好”,

translator.py

class Translator:

    def __init__(self):
        pass

    def chinese(self):
        print("你好!")

    def japanese(self):
        print("空你兄哇!")

    def english(self):
        print("Hello!")

然后在另外一个文件调用这个模块,

demo.py

from translator import Translator

t = Translator()
t.japanese()
t.english()
t.chinese()

执行结果:

空你兄哇!
Hello!
你好!

然后一个广东的程序员用这个模块的时候,希望调用chinese的时候能print“雷猴”而不是“你好”。

再不改变原来模块(库)的情况下,我们可以这样给这个模块(库)打上我们需要的补丁。demo.py

from translator import Translator

t = Translator()
t.japanese()
t.english()
t.chinese()

def canton(self):
    print("雷猴!")

Translator.chinese = canton
t2 = Translator()
t2.chinese()

执行结果:

空你兄哇!
Hello!
你好!
雷猴!

猴子补丁的实际应用场景

stackoverflow上有个比较热的猴子补丁使用案例,很多代码用到 import json,后来发现ujson性能更高,如果觉得把每个文件的import json 改成 import ujson as json成本较高,或者说想测试一下用ujson替换json是否符合预期,只需要在入口加上:

import json
import ujson

def monkey_patch_json():  
    json.__name__ = 'ujson'  
    json.dumps = ujson.dumps
    json.loads = ujson.loads

monkey_patch_json()

猴子补丁的功能很强大,但是也带来了很多的风险,以上对json模块的修改可能会使整个Python进程所使用的json模块都会被替换。

可能自己的代码能hold住,但是其它第三方库,有时候问题并不好排查,即使排查出来也是很棘手。

相关文章

厉害!普通人借助大模型也可以成为Python大神

作者:憨憨今天学习了一下用大模型来学习一下写代码。写完后,我让我程序员朋友给看了看,结果是能用,并且还知道抛出异常。不得不说,大模型的兴起让程序员感到了危机。高喊!普通人借助大模型也可以成为Pytho...

Python 高效编程,开发大神都在用的技巧

写日常开发中,你是否会觉得自己编写的代码不够简洁、不够高效,并且运行的速度都不尽人意呢?别担心,今天就带你解锁那些开发大神爱不释手的Python高效编程技巧,让你的代码实现华丽转身!数据处理的魔法:生...

Python 小白必看!Pandas 带你秒变数据分析大神

家人们,谁懂啊!还在为处理海量数据抓耳挠腮?今天就给大家分享一个 Python 界的 “王炸” 数据分析工具 ——Pandas,真的是用过就离不开,妥妥的数据界瑞士军刀!啥是 Pandas?简单来说,...

跟着DeepSeek,打通Python编程从菜鸟到大神的任督二脉!

以下是通过DeepSeek平台掌握Python编程的系统路径,结合AI工具特性与语言学习规律,提供从基础到高阶的完整知识框架:一、Python基础语法快速入门1. 变量与数据类型o 变量无需声明直接赋...

想玩透数据分析?这本 Python 神作别错过,开启数据大神进阶路

这本书几乎是数据分析入门必读书了。主要介绍了python 3个库numpy(数组),pandas(数据分析)和matplotlib(绘图)的学习。但是需要注意的是,看这本书的前提是你要会Python基...

30天带你从Python小白变成大神,这份笔记你值得拥有(全程干货)

“人生苦短,我用Python。”Python的火爆大家有目共睹,原因无外乎Python入门容易、容易就业,而且还有7大就业方向可供选择,可以说是新人入门的不二之选。但是尽管Python简单易学,但仍有...