我的问题类似于this one,但我想继续前进。
我正在解析配置文件,该文件按名称调用许多操作(带参数)。例如:
"on_click": "action1", "args": {"rate": 1.5}
动作是python类,继承自基类Action
类,可以接受命名参数。它们存储在项目的“actions”子目录中,前缀为a_
。我希望能够通过简单地删除新文件来添加新操作,而无需更改任何其他文件。项目结构如下:
myapp/
actions/
__init__.py
baseaction.py
a_pretty.py
a_ugly.py
...
run.py
所有操作类都提供PerformAction()
方法和GetName()
方法,这是配置文件所引用的方法。在此示例中,a_pretty.py
定义了一个名为PrettyPrinter
的类。在GetName()
上拨打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)
,我会看到类名;我只是不知道接下来应该做什么(或者如果整个方法是正确的方法......)。
答案 0 :(得分:2)
如果module
中的所有内容都是您应该实例化的类,请尝试以下方法:
for in actions:
try:
module = __import__("actions.%s" % a, globals(), locals(), fromlist=["*"])
# What goes here?
# let's try to grab and instanciate objects
for item_name in dir(module):
try:
new_action = getattr(module, item_name)()
# here we have a new_action that is the instanciated class, do what you want with ;)
except:
pass
except ImportError:
pass