我在启动时加载了几个模块。每个模块都有一个名称和一个发送功能。要访问导入的模块,我将它们存储在dict中并通过dict键访问。
m1 = Module1()
m2 = Module2()
modules = {m1.name: m1, m2.name: m2}
# now access a function
modules["m1_name"].send()
这种方法效果很好,但对我来说似乎有点难看。 有“官方”方式吗?
修改
我定义了一个优先级列表,比如说prios = ["signal", "telegram", "txt"]
,程序试图将消息发送给一个组的每个用户,总是试图使用具有最高优先级的模块。
仅导入prio
列表中的模块。
修改 我的导入功能如下所示:
for modul_name in prios:
modul_import = importlib.import_module(("modules." + modul_name))
modul = modul_import.Modul(self.inbox)
modul.start()
modules[modul_name] = modul
答案 0 :(得分:0)
您是否从示例中导入它的同一模块中访问m1
和m2
?如果是这样,name
访问它似乎是不必要的间接。
否则,在导入模块的范围内使用m1
和m2
可以使其导入该模块的其他模块可以访问,在这种情况下,您可以使用更直接的模块对象本身访问它和Pythonic - 见pattern。
您可能希望明确声明这些导出,并隐藏其余m1
和m2
__all__ = ['m1_send', 'm2_send']
m1_send = m1.send
m2_send = m2.send
最后,您确定不会使用__name__
复制name
吗?在docs here中搜索__name__
。
答案 1 :(得分:0)
您能举例说明如何使用模块字典吗?是否需要间接调用send函数给出模块名称?
无论如何,你的方法对我来说很干净,但也许你更愿意使用这里描述的AttrDict:Accessing dict keys like an attribute in Python?
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
modules = AttrDict(m1.__name__=m1, m2.__name__=m2)
modules.m1.send()
modules.m2.send()