- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 Python 中,术语 monkey patch
仅指在运行时动态修改类或模块,作为初学者,我真的很难在 python 上下文中理解这个术语。谁能用真实世界的例子向我解释我们到底是怎么做的?
我坚持要用一个真实世界的例子(尽可能简单)来理解我们必须在哪些场景下完成这样的任务?
最佳答案
Monkey-patching 是一种以现有代码将继续运行但具有修改后的行为的方式进行某些全局底层更改的方法。
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
的代码。它可能是一个巨大的包,我们只是使用并且无法更改。但是我们可以插入要调用的新代码来改变行为。
>>> 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']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.
>>> from gevent import monkey; monkey.patch_socket()
>>> import urllib2 # it's usable from multiple greenlets now
关于python - python 中的猴子修补 : When we need it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977270/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我尝试过sp_helpindex,但它显示的是具有索引的列,而不是包含的列。请告诉我如何列出包含列(非键)的所有索引? 最佳答案 针对目录 View 尝试此 T-SQL 查询: SELECT
我是一名优秀的程序员,十分优秀!