NIl*_*rma 3 python monkeypatching
在Python中,术语monkey patch仅指运行时对类或模块的动态修改.作为初学者,我很难理解python上下文中的这个术语.任何人都可以通过现实世界的例子向我解释我们究竟是怎么做的?
我坚持一个真实世界的例子(尽可能简单)来理解我们必须在哪些场景中完成这样的任务?
修补程序是一种以现有代码将继续运行但具有修改行为的方式进行全局内部更改的方法.
str命令行为的一个非常简单的例子:b.py
def foo(msg):
s = str(msg)
print s, type(s)
Run Code Online (Sandbox Code Playgroud)
a.py
import b
b.foo('foo')
# monkey-patch
import __builtin__
__builtin__.str = unicode
b.foo('foo')
# Results:
#foo <type 'str'>
#foo <type 'unicode'>
Run Code Online (Sandbox Code Playgroud)
该a模块使用该str命令修改了其他代码的行为,通过修改它来unicode代替使用.这是必要的,因为我们假装我们无法访问b.py代码.它可能是一个巨大的包,我们只是使用,不能改变.但是我们可以使用新的代码来改变行为.
Run Code Online (Sandbox Code Playgroud)>>> 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的模块也可以从多绿色环境中运行中受益.
Run Code Online (Sandbox Code Playgroud)>>> from gevent import monkey; monkey.patch_socket() >>> import urllib2 # it's usable from multiple greenlets now
| 归档时间: |
|
| 查看次数: |
3388 次 |
| 最近记录: |