使用class.name作为键保存在dict中的类

时间:2016-04-03 20:55:30

标签: python

我在启动时加载了几个模块。每个模块都有一个名称和一个发送功能。要访问导入的模块,我将它们存储在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

2 个答案:

答案 0 :(得分:0)

您是否从示例中导入它的同一模块中访问m1m2?如果是这样,name访问它似乎是不必要的间接。

否则,在导入模块的范围内使用m1m2可以使其导入该模块的其他模块可以访问,在这种情况下,您可以使用更直接的模块对象本身访问它和Pythonic - 见pattern

您可能希望明确声明这些导出,并隐藏其余m1m2

__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()