首页 > 其他分享 >万能的字典,可以通过 config.server.port 的方式访问,也可以通过get_config("server.port")的方式访问,还可以config['se

万能的字典,可以通过 config.server.port 的方式访问,也可以通过get_config("server.port")的方式访问,还可以config['se

时间:2024-06-15 23:35:12浏览次数:14  
标签:self value server config port dot

万能的字典,可以通过 config.server.port 的方式访问,也可以通过get_config("server.port")的方式访问,还可以config['server']['port']访问值

class DotDict(dict):
    """
    一个字典类,支持通过点分路径访问和设置嵌套的字典值。
    """

    def __init__(self, *args, **kwargs):
        """
        初始化DotDict实例,自动将嵌套的字典转换为DotDict实例。
        """
        super().__init__(*args, **kwargs)
        self._convert_to_dotdict()

    def _convert_to_dotdict(self):
        """
        递归地将字典值转换为DotDict实例。
        """
        for key, value in self.items():
            if isinstance(value, dict):
                self[key] = DotDict(value)

    def __getattr__(self, item):
        """
        允许使用属性访问语法来获取字典值。
        如果属性不存在,抛出AttributeError异常。
        """
        try:
            return self.get_config(item)
        except KeyError:
            raise AttributeError(f"{self.__class__.__name__} object has no attribute '{item}'")

    def __setattr__(self, key, value):
        """
        允许使用属性赋值语法来设置字典值。
        如果键不存在,将创建新的键值对。
        """
        self.set_config(key, value)

    def get_config(self, path):
        """
        通过点分路径获取配置值。

        :param path: 配置项的点分路径。
        :return: 配置值。
        """
        keys = path.split('.')
        value = self
        for key in keys:
            if isinstance(value, dict) and key in value:
                value = value[key]
            else:
                raise KeyError(f"Key '{key}' not found in path '{path}'")
        return value

    def set_config(self, path, value):
        """
        通过点分路径设置配置值。

        :param path: 配置项的点分路径。
        :param value: 要设置的值。
        """
        keys = path.split('.')
        target = self
        for key in keys[:-1]:
            if key not in target or not isinstance(target[key], dict):
                target[key] = DotDict()
            target = target[key]
        target[keys[-1]] = value

测试代码

from core.common.libs.dot_dict import DotDict

configs = {
    "server": {
        "port": 8080,
        "host": "localhost"
    },
    "database": {
        "user": "admin",
        "password": "secret",
        "host": "localhost",
    }
}

# 创建DotDict实例
dot_config = DotDict(configs)

# 使用get_config方法
port = dot_config.get_config("server.port")
password = dot_config.get_config("database.password")
print(port)
print(password)
# 使用set_config方法
dot_config.set_config("server.host", "127.0.0.1")
# 使用 . 出对象的方式获取
print(dot_config.server.host)
# 使用 . 出对象的方式赋值
dot_config.server.path = "/image"
print(dot_config.server.path)
print(dot_config.get_config("server.path"))
# 使用字典的方式获取
print(dot_config['server']['host'])
print(dot_config['server']['port'])
print(dot_config.get_config("server.host"))
# 使用字典的方式赋值
dot_config['server']['aaa'] = "5000"
print(dot_config.server.aaa)
print(dot_config.get_config("server.aaa"))


最后输出

标签:self,value,server,config,port,dot
From: https://www.cnblogs.com/skyvip/p/18249995

相关文章

  • 使用mysql_config_editor可以为特定的MySQL服务器或客户端程序设置登录路径
    login_path介绍在MySQL中,login_path通常不是MySQL服务器配置或SQL语句的一部分。但是,它经常与MySQL的命令行工具mysql_config_editor一起使用,这是一个允许用户安全地存储认证凭据(如用户名、密码和连接参数)的工具。mysql的client工具都能使用login-path,如......
  • FineReport基础
    一、介绍官网:FineReport产品简介-FineReport帮助文档-全面的报表使用教程和学习资料报表是以表格、图表的形式来动态展示数据,企业通过报表进行数据分析,进而用于辅助经营管理决策。FineReport是一款用于报表制作,分析和展示的工具,用户通过使用FineReport可以轻松的构......
  • chatTTS系列之-apiServer
    文章目录背景技术方案方案实现安装FastAPI编写一个入口逻辑实现全局只维护一个chat对象生成随机音色合成一个完整音频返回结果总结背景在之前文章中我们对chattts有了一个大致的了解并对webui进行了一定的优化。然而,还有很多情况下我们还需要进行api调用。gradio......
  • 鸿蒙开发电话服务:【@ohos.telephony.observer (observer)】
    observer说明:本模块首批接口从APIversion6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。导入模块importobserverfrom'@ohos.telephony.observer'observer.on(‘networkStateChange’)on(type:‘networkStateChange’,callback:Callback......
  • 【SQL Server】SQL server复制表结构和复制表数据
    From: https://blog.csdn.net/qq_36636312/article/details/987623941,复制表结构select*into新表名称from旧表名称;1这个SQL语句可以将表的数据也复制过来注意:像主键,外键这种属性是无法复制过来的补充:当新表名称已经在数据库中存在的时候,使用此语句操作则会报错法2:也可以......
  • 【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configurati
    问题描述如果在使用.NET代码对AADJWTToken进行验证时候,如果遇见无法访问 Unabletoobtainconfigurationfrom:'https://login.partner.microsoftonline.cn/<commonoryourtenantid>/v2.0/.well-known/openid-configuration‘,可以配置 HttpClientHandler.Proxy代理。......
  • 在 Microsoft SQL Server 2012 中,修改密码的方法与 SQL Server 2000 相比有所变化,但基
    在MicrosoftSQLServer2012中,修改密码的方法与SQLServer2000相比有所变化,但基本思路是相似的。以下是几种常见的方法:使用SQLServerManagementStudio(SSMS):这仍然是最常见和推荐的方法。通过打开SQLServerManagementStudio,连接到相应的SQLServer实例,然后......
  • 基于Python3.11及SQL Server实现股票组合价值曲线相关计算分析
       本文中Python的版本使用的是3.11,数据库使用的是SQLSERVER2008,项目运行效果图如下:蒙特卡洛相关:突出风险最小点:夏普比率相关夏普比率无风险最大点文章中的股票每日交易数据摘取自:英为财情 https://cn.investing.com/蒙特卡洛及夏普相关计算参考【胖哥真......
  • ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(3
    接前一篇文章:ESP-IDFOTA升级过程中遇到的“esp_transport_readreturned:-1anderrno:128”问题(2)这几天一直在和乐鑫ESP-IDF的OTA机制和工程代码较劲。自从比笔者打开蓝牙功能,使得App固件文件陡然变大之后(223KB->1567KB),原本100%可以升级成功的程序成功率突然降得很低了。......
  • 提取SQL Server 数据库数据字典
    SELECT表名=CASEWHENA.COLORDER=1THEND.NAMEELSE''END,表备注=CASEWHENA.COLORDER=1THENISNULL(F.VALUE,'')ELSE''END,列序号=A.COLORDER,列名称=A.NAME,标识=CASEWHENCOLUMNPROPERTY(A.ID,A.NAME,'ISIDENTITY')=1THE......