允许将非python模块格式加载为模块
abm的Python项目详细描述
Allow loading non Python module formats as modules.
安装
使用pip安装:
$ pip install abm
用法
安装后,您可以通过导入abm.activate来激活abm:
fromabmimportactivate
现在您可以通过执行以下操作注册新的加载程序:
fromabm.loadersimportIniLoaderIniLoader.register()
从现在起,您可以像加载模块一样加载*.ini文件:
# config.ini[section]option=value
importconfigassert(config['example']isnotNone)assert(config['example']['option']is'value')
注意
abm.loaders包正在工作。 abm.loaders包仍在工作,它将收集 一组用于公共扩展的有用加载程序。
编写加载程序
扩展abm.loaders中提供的基本加载程序AbmLoader,并实现 create_module和execute_module方法。提供extension 允许自动注册的类成员:
fromconfigparserimportConfigParserfromtypesimportModuleTypefromabm.loadersimportAbmLoaderclassIniLoader(AbmLoader):extensions=('.ini',)def__init__(self,name,path):self.file_path=pathdefcreate_module(self,spec):module=ConfigModule(spec.name)self.init_module_attrs(spec,module)returnmoduledefexec_module(self,module):module.read(self.file_path)returnmoduleclassConfigModule(ModuleType,ConfigParser):def__init__(self,specname):ModuleType.__init__(self,specname)ConfigParser.__init__(self)
加载程序初始化时将以以下形式传递模块的名称:
'path.to.the.module'
以及它的绝对路径。
实现create_module
create_module函数应生成正确类型的模块。没有什么 更多。此方法与用于查找 模块:
defcreate_module(self,spec)module=ConfigModule(spec.name)self.init_module_attrs(spec,module)returnmodule
实现execute_module
execute_module函数应包含用于加载内容的代码 模块的:
defexecute_module(self,module):module.read(self.file_path)returnmodule
确定如何实现此方法的一个好技巧是想象您 触发模块的重新加载:将模块内容与 文件是你应该放在这里的。
它是如何工作的
扩展机制通过monkeypatching负责的FileFinder类来工作 从本地文件系统读取python的几个格式模块。
在内部,FileFinder使用文件加载程序读取 由文件扩展名标识的python模块。尽管这些课程 public,FileFinder不公开任何扩展机制来链接new 新装载机的扩展。
本着sys.path_hooks和其他扩展钩子的精神,激活 abm将在sys.abm_hooks中公开字典以注册新加载程序 动态的。例如:
importsysfromabm.loadersimportIniLoaderfromabm.coreimportactivateactivate()sys.abm_hooks['.ini']=IniLoader
它通过将 FileFinder实例到类属性中。设置属性将 在读取新值时,将新值分散到不同的属性 将原始的和sys.abm_hooks中的扩展合并。