如何从导入的模块中调用函数,即设计问题

时间:2014-04-25 14:39:42

标签: python import

我一直在努力寻找答案,却找不到任何答案。也许我的做法很糟糕。

我有一个脚本,我想以这样的方式编写,以便将来可以轻松扩展(使用模块)。出于这个原因,我在所述脚本中创建了一个“注册”模块的函数;基本上,使用模块提供的密钥将模块提供的功能添加到字典中。

我的初始和当前计划是从我导入的模块中调用该函数,这显然不起作用。我可以以某种方式从模块内部调用该函数吗?如果没有,我还能怎样解决这个问题?我的问题是我在这里和那里都有动态函数名,我不能只从给定的字符串中调用一个函数,所以我正在创建一个完全相同的字典。但是为了简单起见,我宁愿只导入所有模块,除了主脚本之外没有做任何事情。

1 个答案:

答案 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")