You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套字典转为多层SimpleNamespace,实现全层级点符号访问?

解决嵌套字典转SimpleNamespace的问题

我太懂这个痛点了——用SimpleNamespace就是奔着舒服的点符号访问去的,结果嵌套的字典没转成命名空间,瞬间就破功了。其实问题根源很明确:你只转换了顶层的字典,嵌套的子字典还是原生dict类型,自然没法用.访问属性。

这里有个完美的解决方案,结合json.load的object_hook参数和递归函数,能把所有层级的字典(甚至列表里的嵌套字典)都转换成SimpleNamespace:

import json
from types import SimpleNamespace

def dict_to_namespace(obj):
    # 处理字典:递归转换每个键值对
    if isinstance(obj, dict):
        return SimpleNamespace(**{k: dict_to_namespace(v) for k, v in obj.items()})
    # 处理列表:遍历每个元素做转换
    elif isinstance(obj, list):
        return [dict_to_namespace(item) for item in obj]
    # 其他基础类型直接返回
    else:
        return obj

# 加载配置并完成全层级转换
with open("config.json", 'r') as f:
    SETTINGS = json.load(f, object_hook=dict_to_namespace)

为什么这个方法管用?

json.load的object_hook参数会让JSON解析器每次把JSON对象转成Python字典后,自动调用我们传入的函数处理这个字典。dict_to_namespace函数会递归检查每个值:

  • 如果是字典,就把它转换成SimpleNamespace,同时继续处理它的所有子值
  • 如果是列表,就遍历每个元素,对每个元素执行同样的转换逻辑
  • 字符串、数字、布尔值这类基础类型直接保留原样

这样处理后,不管你的配置有多少层嵌套,所有字典都会变成SimpleNamespace,你就能放心地用SETTINGS.server_info.port、SETTINGS.database.credentials.user这种点符号访问所有配置项了。

实际测试示例

假设你的config.json内容如下:

{
    "server_info": {
        "host": "localhost",
        "port": 8080
    },
    "database": {
        "credentials": {
            "user": "admin",
            "password": "secret"
        },
        "tables": ["users", "posts"]
    }
}

加载后执行这些代码完全没问题:

print(SETTINGS.server_info.host)  # 输出: localhost
print(SETTINGS.server_info.port)  # 输出: 8080
print(SETTINGS.database.credentials.user)  # 输出: admin
print(SETTINGS.database.tables[0])  # 输出: users

反观你原来的代码,只是把顶层字典转成了SimpleNamespace,子字典还是dict类型,所以访问SETTINGS.server_info.port时,server_info是个字典,自然没有port属性,才会抛出AttributeError。

内容的提问来源于stack exchange,提问作者Ryan Schaefer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:49:31