一个只需构造一次的通用可访问配置对象

one-config的Python项目详细描述


配置对象

动机

对于ML项目来说,在一个地方使用所有参数的大型配置对象是很常见的。配置对象有两个基本要求:

  1. 它应该能够轻松地表示不同运行时情况的参数,例如testing和{}。在
  2. 它应该适用于所有模块

为了实现第一个需求,应该以某种方式构造对象(并且在代码库中只这样做一次)。在

为了实现第二个需求,我们可以有一个config.py文件,其中所有配置参数都作为属性。这可以导入到其他模块中,并在特定情况下使用。在

然而,为了实现both requirements,我们似乎必须构造一次配置对象,并将构造的config注入代码库中的所有其他对象。这会扰乱代码库。在

one_config模块试图通过使用singleton模式来解决这个问题。在

一个one_config对象由一个用yaml文件路径参数化的方法构造一次,并且只有一次。一旦构造完成,对象将包含所有参数,即使被另一个模块访问也是如此。在

尽管config.py中的代码对许多读者来说可能是不透明的(其他人可能不同意它是多么“pythonic”),但它的实现应该是直接的,并且对于在任何项目中维护干净的代码都非常有用。在

如何使用它

在适当的位置创建.yaml文件并添加一些参数:

# my_config.yamlmy:nested:-param1-param2

然后,在python包的入口点,用.yaml文件的路径初始化CONFIG对象:

^{pr2}$

在任何其他模块中,您可以导入CONFIG对象,并且来自yaml文件的参数将出现。在

# my_module.pyimportone_configCONFIG=one_config.get_config()param1=CONFIG.my.nested.param1

请注意如何将嵌套参数作为嵌套属性进行访问。在

命名配置

也可以命名一个配置,以便同时拥有多个配置环境:

# run.pyimportone_configone_config.build_config('private').from_yaml('private_env.yaml')
# my_module.pyimportone_configPRIVATE_ENV=one_config.get_config('private')key=PRIVATE_ENV.my.super.secret.key

关于Singleton模式的注记

单例模式是比较有争议的设计模式之一。经常被人嘲笑,被视为“四人帮”的“坏”模式。在stackoveflow上,一致认为singleton要么是反模式,要么在python这样的语言中没有用处。在

在它最初的形式中,单例可能就是所有这些东西。但是,如果我们扩展singleton的定义,使其包括在整个代码基中任何地方状态都相同的对象,我们会注意到在python中我们总是遇到singleton。python模块是单例的。在

我们的singleton只是典型模块singleton的扩展,它允许我们根据外部文件轻松地添加属性。在

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

推荐PyPI第三方库


热门话题
java为什么这个循环打印1020之间的所有值?我想让它打印出可以被5整除的值   java如何在JTable中集中单元格   java无法通过一个键从hashmap获取对象,该键具有相同的hashcode,并且两个键等于()   不兼容的类型?JAVA   将字符串开头与空格匹配时java replaceAll的正则表达式混淆结果   java为非java应用程序创建jar文件。类文件   java无法从另一个普通Http Servlet访问筛选器Servlet的会话属性   java Ejb,第二个方法中的错误回滚第一个方法   swing java操作侦听器在菜单上,而不是在菜单项上   分析文件时出错:分析文件时出错:无法在Java的XSSF中分析excel文件   java将实体注入到ViewScope Bean中   java如何关闭终端而不终止正在运行的jar文件进程   爪哇力下传   java不能隐式地将[T]强制转换为AT,其中[T]扩展为AT   java Spring项目在jsp页面中显示mysql表数据   java在创建新实例SQLITE时出错