python项目实现配置统一管理的方法

2023-11-09

一个比较大的项目总是会涉及到很多的参数,最好的方法就是在一个地方统一管理这些参数。最近看了不少的python项目,总结了两种很有意思的配置管理方法。

第一种 基于easydict实现的配置管理

首先需要安装numpy、easydict以及yaml:

pip install numpy 
pip install easydict
pip install yaml

就可以了。

然后定义配置类config.py

import numpy as np
from easydict import EasyDict as edict
import yaml

# 创建dict
__C = edict()
cfg = __C

# 定义配置dict
__C.dev = edict()
__C.dev.name = 'dev-xingoo'
__C.dev.age = 20

__C.test = edict()
__C.test.name = 'test-xingoo'
__C.test.age = 30

# 内部方法,实现yaml配置文件到dict的合并
def _merge_a_into_b(a, b):
    """Merge config dictionary a into config dictionary b, clobbering the
    options in b whenever they are also specified in a.
    """
    if type(a) is not edict:
        return

    for k, v in a.items():
        # a must specify keys that are in b
        if k not in b:
            raise KeyError('{} is not a valid config key'.format(k))

        # the types must match, too
        old_type = type(b[k])
        if old_type is not type(v):
            if isinstance(b[k], np.ndarray):
                v = np.array(v, dtype=b[k].dtype)
            else:
                raise ValueError(('Type mismatch ({} vs. {}) '
                                'for config key: {}').format(type(b[k]),
                                                            type(v), k))

        # recursively merge dicts
        if type(v) is edict:
            try:
                _merge_a_into_b(a[k], b[k])
            except:
                print(('Error under config key: {}'.format(k)))
                raise
        else:
            b[k] = v
# 自动加载yaml文件
def cfg_from_file(filename):
    """Load a config file and merge it into the default options."""
    with open(filename, 'r', encoding='utf-8') as f:
        yaml_cfg = edict(yaml.load(f))

    _merge_a_into_b(yaml_cfg, __C)

使用的时候很简单,main.py

from config import cfg_from_file
from config import cfg

cfg_from_file('config.yml')
print(cfg.dev.name)
print(cfg.test.name)

同级目录下创建配置文件config.yaml

dev:
  name: xingoo-from-yml

输出:

xingoo-from-yml
test-xingoo

总结

这样的好处就是在任何的Python文件中只要from config import cfg就可以使用配置文件。

第二种 基于Class实现

这种基于普通的python对象实现的,创建config2.py:

class Config:
    def __init__(self):
        self.name = 'xingoo-config2'
        self.age = 100

使用的时候直接创建一个新的对象,如何python模块之间需要引用这个变量,那么需要把配置对象传过去:

import config2 as config2

cfg2 = config2.Config()
print(cfg2.name)
print(cfg2.age)

输出为:

xingoo-config2
100

总结

第二种方法简单粗暴...不过每次传递参数也是很蛋疼。还是喜欢第一种方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python项目实现配置统一管理的方法 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 设置html 头 缓存,html头文件设置常用之设置缓存

    pragma与no cache用于定义页面缓存 不缓存页面 为了提高速度一些浏览器会缓存浏览者浏览过的页面 通过下面的定义 浏览器一般不会缓存页面 而且浏览器无法脱机浏览 常见的取值有private no cache max age mus
  • CodeSmith 使用教程: 总结

    前面基本介绍了CodeSmith的基本用法和编写代码模板的基本方法 这只是CodeSmith功能的一部分 其它部分可以参考CodeSmith文档和类文件定义 此外可以参考CodeSmith附带的示例模板 为便于查询 列出所有文档如下 Cod
  • mysql jdbc reconnect,MySQL JDBC Timeout and AutoReconnect

    24 4 5 3 4 I have a servlet application that works fine for a day and then stops working overnight MySQL closes connecti
  • 教你Ubuntu安装python3.7,并更新python默认指向

    Ubuntu默认的python版本一般为python 2 x 因此需要手动安装自己需要的版本 并且将python的指向更新为自己的版本 先查看当前python的指向 ls l usr bin grep python 因为我这里已经安装好了p
  • 大型公司网络构建拓扑图(华为)

    今天简单了解一下 大型公司的网络搭建 对于很多大型公司来讲 网络的稳定性 会直接影响到公司的收益 比如 双十一的阿里巴巴 京东 等等 如果这个时候网络出现问题 对于公司的损失将会是不可估量的 可见公司网络稳定 对公司的重要性了 那接下来就给
  • 小鱼深度产品测评之:阿里云新款通用算力型ECS云服务器Universal实例,实力与能力并存的一款产品。

    ECS U实例评测 1 引言 2 购买流程 3 向导展示 4 实例 4 1 创建实例 4 2 迁移上云 4 3 查询功能 4 3 1 下拉框选项 4 3 2 查询结果保存 4 4 默认定位 4 5 分组 4 6 监控 4 6 1 查看监控大
  • Qt防止重复调用

    QT中要用到 类似按键防抖static void func to debounce int a qDebug lt lt a 1 lt lt debounce test 需要实现的函数 static void debounce test f
  • Dice系数(Dice coefficient)与mIoU与Dice Loss

    Dice系数和mIoU是语义分割的评价指标 在这里进行了简单知识介绍 讲到了Dice顺便在最后提一下Dice Loss 以后有时间区分一下在语义分割中两个常用的损失函数 交叉熵和Dice Loss 一 Dice系数 1 概念理解 Dice系
  • 在java中插入gif_在java程序中显示gif图片的代码

    import java awt import java awt image public class ImageCanvas extends Canvas Image image public ImageCanvas String name
  • rsync 未授权访问漏洞

    雨笋教育小编来分享干货了 感兴趣的可以一同探讨 0x00前言 rsync是Linux下一款数据备份工具 支持通过rsync协议 ssh协议进行远程文件传输 0x01漏洞原理 rsync协议默认监听873端口 如果目标开启了rsync服务 并
  • BUCK BOOST以及Charge Pump电路原理

    下文为个人总结三种常见的开关电源 如有疑问欢迎评论区讨论 BUCK 当开关管Q1驱动为高电平时 开关管导通 储能电感L1被充磁 流经电感的电流线性增加 同时给电容C1充电 给负载R1提供能量 当开关管Q1驱动为低电平时 开关管关断 储能电感
  • hivesql解析json格式的key与value

    目录 解析json格式中的key 解析json格式中的value json格式示例 city code 340100 county code 340111 orientation 东 road id 35204271 speed 35 72
  • NNDL 实验六 卷积神经网络(3)LeNet实现MNIST

    目录 5 3 基于LeNet实现手写体数字识别实验 5 3 2 模型构建 5 3 3 模型训练 5 3 4 模型评价 5 3 5 模型预测 使用前馈神经网络实现MNIST识别 与LeNet效果对比 选做 可视化LeNet中的部分特征图和卷积
  • docker安装redis Docker安装redis docker安装Redis 详细教程

    docker安装redis Docker安装redis docker安装Redis 详细教程 Docker 上安装 Redis 的步骤 选择要安装的Redis版本 1 拉取 Redis 镜像 2 创建并运行容器 创建 redis conf
  • 02-linux安装nodejs

    1 前期准备 1 Node js简介 简单的说 Node js 就是运行在服务端的 JavaScript Node js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Node js 使用了一个事件驱动 非阻塞式
  • 组态王、力控、MCGS、瑞尔、杰控等国内组态软件一点看法

    2005年08月28日 23 26 00 从结构上说 组态王和MCGS一样 前台动画和后台集成在一起 在运行模式下一起运行 而力控 瑞尔却分为后台驱动 实时数据库 前台三部分组成 更为有意思的是 瑞尔的每一个驱动就是一个EXE 其驱动DLL
  • Spring 中的事件监听机制

    目录 1 标准的 Spring 事件机制 1 ApplicationEvent 自定义事件 2 ApplicationEventPublisher 发布事件 3 ApplicationListener 监听事件 2 基于 EventList
  • 嵌入式与人工智能关系_嵌入式人工智能的发展趋势

    嵌入式与人工智能关系 嵌入式人工智能的发展趋势 所谓嵌入式人工智能 就是设备无须联网通过云端数据中心进行大规模计算去实现人工智能 而是在本地计算 在不联网的情况下就可以做实时的环境感知 人机交互 决策控制 那么嵌入式与人工智能关系是什么 嵌
  • spark学习6:应用程序的打包部署

    standlone 集群模式下 提交应用后 可以在浏览器中输入 spark master 8080 查看执行情况 yarn集群模式下 提交应用程序 提交后 可以在tracking URL 中查看记录 如下图 ps 在 spark shell
  • python项目实现配置统一管理的方法

    一个比较大的项目总是会涉及到很多的参数 最好的方法就是在一个地方统一管理这些参数 最近看了不少的python项目 总结了两种很有意思的配置管理方法 第一种 基于easydict实现的配置管理 首先需要安装numpy easydict以及ya