使用python context来覆盖变量?

时间:2016-01-13 20:44:36

标签: python with-statement

我很确定我已经看过这个,但我无法正确理解语法。我想覆盖一个模块"常数"在测试期间。我可以写这样的代码:

import mymodule

try:
   hold = mymodule.FOO
   mymodule.FOO = 'test value'
   do_something()
finally:
   mymodule.FOO = hold

在我看来,应该有一种方法可以用"用"声明,如:

with mymodule.FOO = 'test value':
    do_something()

我的思想欺骗了我吗?是否有一个简单的语法来做我想要的?

2 个答案:

答案 0 :(得分:5)

听起来像你想要的unittest.mock.patch

from unittest.mock import patch

with patch('mymodule.Foo', 'test value'):
    do_whatever()

如果您使用的是3.3之前的Python版本,则unittest.mock不存在,但PyPI上可以使用backport。您也可以编写自己的上下文管理器来执行此操作。但是,语法中没有任何内容可以做到这一点。

答案 1 :(得分:1)

通常这称为monkeypatching。

unittest.mock为此提供了帮助方法(如另一个答案所示),但在Python stdlib之外,我建议查看py.test's monkeypatching fixture

def test_foo(monkeypatch):
    monkeypatch.setattr('mymodule.FOO', 'test value')
    # more code here
    # ...

    # the monkeypatch is automatically reverted at the end of the test