Макет исправления из /import в Python - программирование
Подтвердить что ты не робот

Макет исправления из /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?

Спасибо

4b9b3361

Ответ 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.