【问题标题】:Is Python's monkey patching local to the current module?Python 的猴子补丁是当前模块的本地补丁吗?
【发布时间】:2013-04-14 22:20:46
【问题描述】:

在文件 a.py 中,我有以下几行:

import gevent gevent.monkey.patch_all() import b # etc, etc

在文件 b.py 中是否需要再次进行猴子补丁?猴子打补丁多次有什么问题吗?

【问题讨论】:

  • 我不是gevent 的专家,但我看不出它不是“全球”的……例如我看不出任何在b 中的调用不会像a 中的猴子补丁版本那样表现。至于猴子多次修补的问题,这可能是安全的,但我想这取决于实现。

标签: python gevent monkeypatching


【解决方案1】:

通常每个模块在sys.modules 中只有一个条目。也就是说,同一个模块对象是共享的,所以只要它以相同的方式导入,它就会影响模块。

如果以不同方式导入,则sys.modules 中可能有两个或多个条目下的相同模块。

【讨论】:

  • 我不认为我完全理解你。例如,socket 是由 gevent 修补的猴子。那么如果a.pyimport socketb.pyfrom socket import *,效果会不一样吗? b.py 不会被猴子补丁吗?
  • @donatello 这取决于何时完成修补以及何时完成导入。如果修补是在导入之前完成的,那么所有导入都会受到影响,但如果导入发生在修补之前,那么a.py 可能有一个修补模块,而@987654330 @ 仍将使用原始功能等(由于星号导入)。我不知道gevent 是如何打补丁的,所以a 可能会也可能不会使用打补丁的版本,这取决于gevent 是替换模块对象还是更改其属性。
猜你喜欢
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
相关资源
最近更新 更多