我正在研究为程序创建一个插件结构,并使其即使核心库被视为插件。在我的研究中,我遇到了这个动态导入模块的代码。
def __initialize_def(self, module):
"""Attempt to load the definition"""
# Import works the same for py files and package modules so strip!
if module.endswith(".py"):
name = module [:-3]
else:
name = module
# Do the actual import
__import__(name)
definition = sys.modules[name]
# Add the definition only if the class is available
if hasattr(definition, definition.info["class"]):
self.definitions[definition.info["name"]] = definition
logging.info("Loaded %s" % name)
我试图理解这段代码的作用,并且我已经成功了。但是,我根本无法理解代码的后半部分,具体是这两行:
if hasattr(definition, definition.info["class"]):
self.definitions[definition.info["name"]] = definition
我无法弄清楚definition.info["<key>"]
指的是什么。
这个.info[]
词典是什么?它包含什么?所有Python对象或仅模块对象是否通用?有什么用?
答案 0 :(得分:2)
py> import sys,os
py> sys.modules["os"].info["class"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'info'
因此,此info属性必须特定于可用作此程序中的插件的模块。
答案 1 :(得分:0)
Python中的保留名称通常以两个下划线开头。您只是偶然发现了一些更大的代码库,这使得info
模块范围值具有特殊含义。无论如何,我不认为它的作者为这些选择了一个特别好的名字; $ FRAMEWORK _MODULE_INFO会更明确。