Мой вопрос похож на этот , хотя я бы хотел пойти дальше.
Я анализирую файл конфигурации, который вызываетколичество действий (с параметрами) по имени.Например:
"on_click": "action1", "args": {"rate": 1.5}
Действия - это классы Python, унаследованные от базового Action
класса, и могут принимать именованные аргументы.Они хранятся в подкаталоге действий проекта с префиксом a_
.Я хотел бы иметь возможность добавлять новые действия, просто добавив туда новый файл, без необходимости изменения каких-либо других файлов.Структура проекта выглядит следующим образом:
myapp/
actions/
__init__.py
baseaction.py
a_pretty.py
a_ugly.py
...
run.py
Все классы действий предоставляют метод PerformAction()
и метод GetName()
, к которым относится файл конфигурации.В этом примере a_pretty.py
определяет класс с именем PrettyPrinter
.Вызов GetName()
on PrettyPrinter
возвращает "action1".
Я хотел бы добавить класс PrettyPrinter
в словарь с ключом "action1", чтобы я мог создавать новые экземпляры этого типа, напримерследующее:
args = {'rate': the_rate}
instantiated_action = actions['action1'](**args)
instantiated_action.PerformAction()
В настоящее время у меня есть следующее:
actions = [os.path.splitext(f)[0] for f in os.listdir("actions")
if f.startswith("a_") and f.endswith(".py")]
for a in actions:
try:
module = __import__("actions.%s" % a, globals(), locals(), fromlist=["*"])
# What goes here?
except ImportError:
pass
Это импорт файла действия, и если я печатаю dir(module)
, я вижу имена классов;Я просто не знаю, что мне делать дальше (или если весь этот подход - правильный путь ...).