【发布时间】:2025-12-07 15:50:01
【问题描述】:
我在用另一个函数替换来自不同模块的函数时遇到问题,这让我发疯。
假设我有一个如下所示的模块 bar.py:
from a_package.baz import do_something_expensive
def a_function():
print do_something_expensive()
我还有另一个看起来像这样的模块:
from bar import a_function
a_function()
from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
a_function()
import a_package.baz
a_package.baz.do_something_expensive = lambda: 'Something really cheap.'
a_function()
我希望得到结果:
Something expensive!
Something really cheap.
Something really cheap.
但是我得到了这个:
Something expensive!
Something expensive!
Something expensive!
我做错了什么?
【问题讨论】:
-
第二个不起作用,因为您只是在本地范围内重新定义了 do_something_expensive 的含义。但是,我不知道为什么第三个不起作用...
-
正如 Nicholas 解释的那样,您正在复制参考并仅替换其中一个参考。由于这个原因,
from module import non_module_member和模块级猴子补丁不兼容,通常最好避免使用。 -
首选的包命名方案是小写,不带下划线,即
apackage。 -
@bobince,最好避免像这样的模块级可变状态,因为全局变量的不良后果早已被认识到。但是,
from foo import bar很好,实际上在适当的时候推荐。
标签: python monkeypatching