![]() |
1
79
考虑一下python名称空间的工作方式可能会有所帮助:它们本质上是字典。所以当你这么做的时候:
这样想:
希望您能够了解为什么这样做不起作用,然后:-)一旦将名称导入到命名空间中,则导入的命名空间中名称的值 从 是无关紧要的。您只需在本地模块的名称空间或上面的一个_package.baz的名称空间中修改do_something_昂贵的值。但是,由于bar导入不直接引用昂贵的内容,而不是从模块名称空间引用它,因此需要写入其名称空间:
|
![]() |
2
20
这里有一个非常优雅的装饰: Guido van Rossum: Python-Dev list: Monkeypatching Idioms . 还有 dectools 包,我看到了一个pycon 2010,它可能也可以在这个上下文中使用,但实际上可能会走另一条路(在方法声明级别的monkeypatching…你不在的地方) |
![]() |
3
4
如果您只想为您的调用修补它,或者保留您可以使用的原始代码 https://docs.python.org/3/library/unittest.mock.html#patch (从python 3.3开始):
|
![]() |
4
3
在第一个片段中,您将
在你试图改变
最简单但远非理想的方法是改变
正确的解决方案可能是两件事之一:
使用globals(这就是从其他模块更改模块级的内容)是 坏事 这会导致无法维护、混乱、不可测试、不可扩展的代码,这些代码的流程很难跟踪。 |
![]() |
5
0
|