我一直在努力寻找答案,却找不到任何答案。也许我的做法很糟糕。
我有一个脚本,我想以这样的方式编写,以便将来可以轻松扩展(使用模块)。出于这个原因,我在所述脚本中创建了一个“注册”模块的函数;基本上,使用模块提供的密钥将模块提供的功能添加到字典中。
我的初始和当前计划是从我导入的模块中调用该函数,这显然不起作用。我可以以某种方式从模块内部调用该函数吗?如果没有,我还能怎样解决这个问题?我的问题是我在这里和那里都有动态函数名,我不能只从给定的字符串中调用一个函数,所以我正在创建一个完全相同的字典。但是为了简单起见,我宁愿只导入所有模块,除了主脚本之外没有做任何事情。
答案 0 :(得分:1)
如果是我,我的设计中会有三个元素:
我的可扩展库:
# master.py
# List of plugins
plugins = []
# registration API called by plugin
import inspect
def register():
frame = inspect.stack()[1]
module = inspect.getmodule(frame[0])
plugins.append(module)
# functional API called by application
def callout():
for m in plugins:
m.shout()
def dynamic_callout(s):
for m in plugins:
getattr(m, s[:2]+s[-3:])()
我的插件:
# plugin1.py
# Register this plugin
import master
master.register()
# Respond to request from master
def shout():
print "Hello from", __name__
最后,我的申请:
# Esablish a plugin by importing it
import plugin1
# Call the API
import master
master.callout()
master.dynamic_callout("shut up or get out")