Макет исправления из /import в Python
Я пытаюсь заставить mock.patch работать над следующим фрагментом примерного кода:
from mock import patch
from collections import defaultdict
with patch('collections.defaultdict'):
d = defaultdict()
print 'd:', d
Выводит следующее:
d: defaultdict(None, {})
Это означает, что defaultdict не был исправлен.
Если я заменил оператор from/import выражением прямого импорта, он будет работать:
from mock import patch
import collections
with patch('collections.defaultdict'):
d = collections.defaultdict()
print 'd:', d
Выход:
d: <MagicMock name='defaultdict()' id='139953944084176'>
Есть ли способ исправить вызов, используя /import?
Спасибо
Ответы
Ответ 1
Если вы исправляете что-то в том же модуле, вы можете использовать __main__
:
from mock import patch
from collections import defaultdict
with patch('__main__.defaultdict'):
d = defaultdict()
print 'd:', d
Если вы что-то издеваетесь над импортированным модулем, вы захотите использовать это имя модуля, чтобы была исправлена правильная ссылка (или имя):
# foo.py
from collections import defaultdict
def bar():
return defaultdict()
# foo_test.py
from mock import patch
from foo import bar
with patch('foo.defaultdict'):
print bar()
Дело в том, что патч хочет полный путь к тому, что он исправляет. Это выглядит немного странно при исправлении чего-либо в текущем модуле, так как люди часто не используют __main__
(или должны ссылаться на текущий модуль, если на то пошло).
Ответ 2
patch
работает, исправляя имена. Вы ничего не можете добиться, установив имя collections.defaultdict
, если вы используете имя defaultdict
(в локальном пространстве имен) для доступа к объекту. См. Документацию на http://www.voidspace.org.uk/python/mock/patch.html#id1.