Я только что начал экспериментировать с новой техникой, которую я называю (по крайней мере, на данный момент) «модульная утиная печать».
Пример:
Основной модуль
import somepackage.req ## module required by all others
import abc
import Xyz
Модуль abc
__all__=[]
def getBus():
""" Locates the `req` for this application """
for mod_name in sys.modules:
if mod_name.find("req") > 0:
return sys.modules[mod_name].__dict__["Bus"]
raise RuntimeError("cannot find `req` module")
Bus=getBus()
В модуле abc
мне не нужно явно указывать import req
: он может быть где угодно в иерархии пакетов. Конечно, это требует некоторой дисциплины...
С помощью этого метода легко перемещать пакеты в иерархии.
Меня ждут подводные камни? например переход на Python 3K
Обновлено: после еще нескольких тестов я решил вернуться к вставке зависимостей пакетов непосредственно в sys.path
.
mod_name.find("req") > 0
на самом деле не то, что вы имеете в виду. Что делать, если у меня есть модуль с именемfrequency
? - person Mike Graham   schedule 24.02.2010sys.modules[mod_name].__dict__["Bus"]
пишетсяsys.modules[mod_name].Bus
. - person Mike Graham   schedule 24.02.2010