使用 ContextManager 覆盖多个全局变量

Overriding multiple global variables with ContextManager

在 Python 2.7 中是否有 utility/pattern 来覆盖上下文中的多个全局变量? IE 类似

var1 = someval
var2 = someotherval
with my_context(var1=newval1, var2=newval2,...):
  print var1   # prints newval1

是的,但它是 unittest.mock.patch 的事实应该告诉您一些关于它的用途的信息:

import unittest.mock

with unittest.mock.patch('module.thing', replacement_thing):
    do_whatever()

如果你想在同一个调用中修补多个东西,你可以使用unittest.mock.patch.multiple:

from unittest.mock import patch

with patch.multiple(module, thing1=replacement_thing, thing2=other_thing):
    # module.thing1 and module.thing2 are now patched
    do_whatever()

只要确保 none 你想要修补的东西恰好与该函数的参数名称冲突(targetspeccreatespec_setautospecnew_callable)。如果他们这样做,请回到常规 patch.

如果您想出于非单元测试目的执行此操作,您可能需要重新考虑您的设计。

如果您使用的是 Python 2 而 unittest.mock 不在标准库中,您可以从 PyPI 下载 backport。这个叫 mock 而不是 unittest.mock.