在Python中修补猴子:当我们需要它时?

Python中,术语猴子补丁仅指运行时对类或模块的动态修改.作为初学者,我很难在python的上下文中理解这个术语.任何人都可以通过现实世界的例子向我解释我们究竟是怎么做的?

>类的动态修改
>在运行时动态修改模块

我坚持一个真实世界的例子(尽可能简单)来理解我们必须在哪些场景中完成这样的任务?

最佳答案
修补程序是一种以现有代码将继续运行但具有修改行为的方式进行全局内部更改的方法.

一个非常简单的改变builtin 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'>

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

一个现实世界的例子from gevent

06002

The example above used gevent.socket for socket operations. If the
standard socket module was used it would took it 3 times longer to
complete because the DNS requests would be sequential. Using the
standard socket module inside greenlets makes gevent rather pointless,
so what about module and packages that are built on top of socket?

That’s what monkey patching for. The functions in gevent.monkey
carefully replace functions and classes in the standard socket module
with their cooperative counterparts. That way even the modules that
are unaware of gevent can benefit from running in multi-greenlet
environment.

06003

转载注明原文:在Python中修补猴子:当我们需要它时? - 代码日志