2016-05-23 2 views
0

Есть ли утилита/шаблон для переопределения нескольких глобальных переменных в контексте в Python 2.7? IE что-то вродеПереопределение нескольких глобальных переменных с помощью ContextManager

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

Yikes ... Глобальное состояние, которое вы хотите изменить? Я сомневаюсь, что это существует, потому что это не похоже на то, что большинство людей захочет ... – mgilson

ответ

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() 

Просто убедитесь, что ни один из вещей, которые вы хотите, чтобы патч случится столкнуться с именами аргументов этой функции (target, spec, create, spec_set, autospec, или new_callable). Если они это сделают, вернитесь к обычным patch.

Если вы хотите сделать это для целей не-модульного тестирования, вы можете захотеть пересмотреть свой дизайн.

Если вы находитесь на Python 2 и unittest.mock нет в стандартной библиотеке, вы можете скачать backport из PyPI. Этот номер называется mock, а не unittest.mock.

+2

Вместо этого используйте 'unittest.mock.patch.multiple', что, похоже, делает именно то, что хочет OP. – ppperry

+0

@ppperry: О, да. Я не знал, что это было так! Спасибо за совет. – user2357112

+0

И я полагаю, что 'patch.dict' может быть использован для исправления' globals() 'в текущем модуле, если это необходимо ... – mgilson

Смежные вопросы