Форум сайта python.su
3
Есть программа, которая обрабатывает события, события различаются, поэтому для каждого свой обработчик.
Эти обработчики я хочу сделать плагинами, чтоб оперативно добавлять/изменять
сделал вот так:
def create_worker(work): exec ('import %s' % (work,)) exec ('worker = %s.%s_wrk()' % (work,work)) return worker worker = create_worker(work) worker.go(data)
Отредактировано Iskatel (Июль 29, 2015 17:14:07)
Офлайн
88
Почитайте в документации об __import__ и reload.
Офлайн
253
IskatelИмпорт это выполнение кода при условии если он не выполнялся раньше. При этом код должен быть в файле.
какие подводные камни могут быть при таком подходе?
Отредактировано doza_and (Июль 29, 2015 22:38:46)
Офлайн
88
Модуль может быть и бинарным.
Офлайн
3
Я вообще не понимаю в чем эта модульность.
Пока что понял, что модуль это свой namespace, пока из него не импортируешь “*”
А вот дальше непонятно. Толи в результате импортов получается какаято общая портянка, как после сишного препроцессора, а затем выполняется. Толи есть механизм контроля этих модулей, и можно рулить ими рантайм.
doza_and
Импорт это выполнение кода при условии если он не выполнялся раньше. При этом код должен быть в файле.
exec безусловное выполнение без этих ограничений.
Отредактировано Iskatel (Июль 29, 2015 23:40:58)
Офлайн
221
Iskatel
Ознакомьтесь с книгой Лутца “Изучаем Python”, там есть главы 18 и 19 - как раз именно то что вам надо - понимание архитектуры программ на питоне, модули и как они работают.
И да, про exec для таких целей забудьте. Это не безопасно. И не практично.
У меня есть проект в котором я делал систему плагинов. В основной части кода я использовал модуль importlib и функцию import_module для импорта модуля, имя которого считывал из конфиг файла. Сами плагины представляли собой python модули расположенной в субдиректории с единым интерфейсом (классом с обязательными методами).
Офлайн
88
Iskatel- нет.
Пока что понял, что модуль это свой namespace, пока из него не импортируешь “*”
Iskatel- второе.
Толи в результате импортов получается какаято общая портянка, как после сишного препроцессора, а затем выполняется. Толи есть механизм контроля этих модулей, и можно рулить ими рантайм.
IskatelВсё выполняемое по правилам языка по ходу текста.
Что именно там выполняется? обьявление классов/функций, или уже прекомпиляция во чтото рабочее? Сами то функции при импорте не вызываются.
IskatelОбъекты решат почти все ваши проблемы.
Я надеялся что всетаки есть механизм выгрузки “всего старого модуля” и загрузки нового, тоесть “old ‘a’ not is new ‘a’ ”
Iskatelhttps://docs.python.org/3.4/tutorial/modules.html
Мне б поподробней, желательно со ссылками где почитать по теме.
Отредактировано Shaman (Июль 30, 2015 00:05:35)
Офлайн
88
IskatelЛучше один раз попробовать:
И самое главное забыл спросить: exec, вызванный в контексте функции, вернет этот worker в области видимости функции, или он будет глобальным?
>>> def t(): exec('import math') print math.pi >>> math Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> math NameError: name 'math' is not defined >>> t() 3.14159265359 >>> math.pi Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> math.pi NameError: name 'math' is not defined >>> def t(): exec('import math', globals(), locals()) print math.pi >>> t() 3.14159265359 >>> math Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> math NameError: name 'math' is not defined >>> def t(): exec('import math', globals(), globals()) print math.pi >>> t() 3.14159265359 >>> math <module 'math' (built-in)> >>> math.pi 3.141592653589793 >>>
Офлайн
3
Спасибо, знать бы что пробовать, тут же ни машинных кодов ни регистров процессора не глянешь. Живет какойто своей жизнью…
Отредактировано Iskatel (Июль 30, 2015 00:17:32)
Офлайн
88
Вот и забудьте пока о них, раз толку никакого.
Офлайн