我在用另一个函数替换不同模块中的函数时遇到了麻烦,这让我发疯。
假设我有一个模块 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!
我究竟做错了什么?
思考 Python 命名空间的工作原理可能会有所帮助:它们本质上是字典。所以当你这样做时:
from a_package.baz import do_something_expensive
do_something_expensive = lambda: 'Something really cheap.'
可以这样想:
do_something_expensive = a_package.baz['do_something_expensive']
do_something_expensive = lambda: 'Something really cheap.'
希望您能意识到为什么这不起作用:-) 将名称导入命名空间后,您导入的命名空间中的名称值from是无关紧要的。您仅修改本地模块的命名空间或上面的 a_package.baz 的命名空间中的 do_something_expense 的值。但是因为 bar 直接导入 do_something_expense,而不是从模块命名空间引用它,所以您需要写入其命名空间:
import bar
bar.do_something_expensive = lambda: 'Something really cheap.'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)