Monkey Patch

Monkey patch就是在运行时对已有的代码进行修改,达到hot patch的目的!

python namespace

locals

globals

builtin

其中定义在函数内声明的变量属于locals,而模块内定义的函数属于globals。

Python module Import

当我们import一个module时,python会做以下几件事情

导入一个module

将module对象加入到sys.modules,后续对该module的导入将直接从该dict中获得

将module对象加入到globals dict中

当我们引用一个模块时,将会从globals中查找。这里如果要替换掉一个标准模块,我们得做以下两件事情

将我们自己的module加入到sys.modules中,替换掉原有的模块。如果被替换模块还没加载,那么我们得先对其进行加载,否则第一次加载时,还会加载标准模块。

(这里有一个import hook可以用,不过这需要我们自己实现该hook,可能也可以使用该方法hook module import)

如果被替换模块引用了其他模块,那么我们也需要进行替换,但是这里我们可以修改globals() dict,将我们的module加入到globals以hook这些被引用的模块。

1. import 实际上是python虚拟机把当前的globals()和locals()传进__builtins__.__import__内置函数了,所以实际上干活的是那个__import__函数!

2. import对命名空间的影响

1)如果是python的内置模块,例如os模块。这些模块是随着python虚拟机启动而加载进来的,但是并没有暴露出来。我们可以通过dir()命令查看当前命名空间

通过sys.modules这个字典(key: 模块名;value: 模块的路径),我们可以查看模块的信息

2)  import只影响当前模块的命名空间

3. import package

首先合法的package必须含有一个__init__.py文件,package可以包含0个或多个module(py文件).

import packtest.sub.b __init__.py文件的内容第一次导入是输出。

print sys.modues

4 from与import

时间: 2024-10-13 20:56:26

Monkey Patch的相关文章

Monkey Patch/Monkey Testing/Duck Typing/Duck Test

Monkey Patch Monkey Testing Duck Typing Duck Test

什么是猴子补丁(monkey patch)

monkey patch指的是在运行时动态替换,一般是在startup的时候. 用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了. 之前做的一个游戏服务器,很多地方用的import json,后来发现ujson比自带json快了N倍,于是问题来了,难道几十个文件要一个个把import json改成import

Python Monkey patch猴子补丁

monkey patch (猴子补丁)   用来在运行时动态修改已有的代码,而不需要修改原始代码. 简单的monkey patch 实现:[python] #coding=utf-8 def originalFunc():     print 'this is original function!'      def modifiedFunc():     modifiedFunc=1     print 'this is modified function!'      def main():

python的猴子补丁monkey patch

monkey patch指的是在运行时动态替换,一般是在startup的时候. 用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了. 一个比较实用的例子,很多代码用到 import json,后来发现ujson性能更高,如果觉得把每个文件的import json 改成 import ujson as json成

python中的猴子补丁Monkey Patch

python中的猴子补丁Monkey Patch 什么是猴子补丁 the term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent to patch existing third-party code as a workaround to a bug or feature which does not act as desired

python用from gevent import monkey; monkey.patch_all()之后报ssl等错误

楼主今天第一次用python基于greenlet实现的第三方协程库gevent,由于gevent在切换IO操作(文件IO.网络IO)时是自动完成的,所以gevent需要通过修改Python自带的一些阻塞式系统调用的标准库,包括socket.ssl.threading和 select等模块,而变为协程,这一过程需要在启动时通过monkey patch完成. import gevent from gevent import monkey monkey.patch_all() 楼主遇到的报错如下(简略

读《我为什么从python转向go》的一些感受

一开始我以为是一篇2013年的老帖子,没想到竟然是2015年.不懂Python不要乱喷啊.你直接说"我不懂Python,我也不愿意维护前任写的糟糕代码,我Go牛B,所以我要重构一遍!"我到觉得你智商正常点.. 我觉得go不错,但是如果不是特定领域开发,没有足够多成熟稳定的库仍然很麻烦的事情. http://www.jianshu.com/p/afa14e631930 http://www.lupaworld.com/article-254456-1.html python虽然很强大,但

聊聊Javascript中的AOP编程

Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla 这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过du

聊Javascript中的AOP编程

我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过duck typing.举一