使用ContextManager覆盖多个全局变量

时间:2016-05-23 23:52:41

标签: python contextmanager

是否有实用程序/模式在Python 2.7中覆盖上下文中的多个全局变量? IE就好像

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

1 个答案:

答案 0 :(得分:2)

是的,但事实是它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()

请确保您要修补的内容不会碰到该函数的参数名称(targetspeccreatespec_set,{ {1}}或autospec)。如果他们这样做,请回到常规new_callable

如果您想进行非单元测试,可能需要重新考虑您的设计。

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