一个只需构造一次的通用可访问配置对象
one-config的Python项目详细描述
配置对象
动机
对于ML项目来说,在一个地方使用所有参数的大型配置对象是很常见的。配置对象有两个基本要求:
- 它应该能够轻松地表示不同运行时情况的参数,例如
testing
和{}。在 - 它应该适用于所有模块
为了实现第一个需求,应该以某种方式构造对象(并且在代码库中只这样做一次)。在
为了实现第二个需求,我们可以有一个config.py
文件,其中所有配置参数都作为属性。这可以导入到其他模块中,并在特定情况下使用。在
然而,为了实现both requirements,我们似乎必须构造一次配置对象,并将构造的config
注入代码库中的所有其他对象。这会扰乱代码库。在
one_config
模块试图通过使用singleton模式来解决这个问题。在
一个one_config
对象由一个用yaml文件路径参数化的方法构造一次,并且只有一次。一旦构造完成,对象将包含所有参数,即使被另一个模块访问也是如此。在
尽管config.py
中的代码对许多读者来说可能是不透明的(其他人可能不同意它是多么“pythonic”),但它的实现应该是直接的,并且对于在任何项目中维护干净的代码都非常有用。在
如何使用它
在适当的位置创建.yaml
文件并添加一些参数:
# my_config.yamlmy:nested:-param1-param2
然后,在python包的入口点,用.yaml
文件的路径初始化CONFIG
对象:
在任何其他模块中,您可以导入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的扩展,它允许我们根据外部文件轻松地添加属性。在
- 项目
标签: