Когда вы делаете import foo
, если sys.modules['foo']
уже существует, интерпретатор просто возвращает это вместо того, чтобы выполнять новый импорт.
Таким образом, чтобы сфальсифицировать оператор import
module1
, просто введите значение перед загрузкой module1
. Это немного хакерски, но очень просто. Например:
mytest.py:
import sys
import unittest
import my_fake_module
sys.modules['module_i_want_to_fake'] = my_fake_module
import module1
//test code here
module1.some_method()
//test code here
модуль1.py:
import module_i_want_to_fake
print(module_i_want_to_fake)
Это напечатает что-то вроде этого:
<module 'my_fake_module' from 'my_fake_module.pyc'>
Если вам нужно более тщательно подделать module1
(даже если он попытается изучить модуль), вы можете создать новый модуль (через types.ModuleType
) с кодом из my_fake_module
, но с именем 'module_i_want_to_fake'
и любыми другими изменениями, которые вы хотите.
Если вам нужно сделать это более динамично, чем это можно сделать, просто предварительно переименовав модули статически, вы можете создать обработчик импорта, как описано в PEP 302. Это требует от вас повторной реализации значительной части механизма импорта, что является огромной проблемой в версии 2.x, но importlib
в 3.1+ делает это намного проще.
К счастью, обычно вам не нужно делать ни того, ни другого.
person
abarnert
schedule
13.03.2013
import module1 as m1
Или использовать другое имя в качестве ссылки на него. - person ninMonkey   schedule 14.03.2013module1
перехватывать его операторыimport
, чтобы вы могли подставлять разные модули? - person abarnert   schedule 14.03.2013