允许将非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_moduleexecute_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中的扩展合并。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Jboss 4.2.1 GA java。lang.OutOfMemoryError:永久空间   java将ActiveMQResourceAdapter绑定到Weblogic中的自定义工作管理器   java如果计时器落后于计划怎么办   java从DNS获取完整的区域记录,DNSJava不会返回所有记录   java NoClassDefFoundError:com/google/common/reflect/TypeToken   java将列表拆分为组   java绘制图像的形状   java JAR文件未打开   无法从子WebApplicationContext访问根ApplicationContext中配置的java Spring拦截器   循环的java Android对话框是否未执行?   java更高效地存储(字符串、整数)元组并应用二进制搜索   java输出项目的数据。在Eclipse中将文件类化到另一个项目的资源文件夹中   java writer。writeAll(rs,true)创建一个空文件   多线程自定义fork-join池正在java程序中与公共池一起使用   使用“if”、“while”和“loop”方法时出现java非法表达式   安卓正在尝试将msqlite字符串日期转换为java。sql。日期   java Spring Hibernate StaleObjectStateException由于新的HashSet?   java跟踪实例属性的更改