easydict
?easydict
是一个轻量级 Python 库,它允许开发者通过 点号操作符(.
) 访问字典的键值,实现类似 JavaScript 对象属性的访问方式,提升代码可读性和简洁性。
easydict
:# 原生字典
data = {"name": "Alice", "age": 30}
print(data["name"]) # "Alice"
# easydict
from easydict import EasyDict
edata = EasyDict(data)
print(edata.name) # "Alice" (点号访问)
pip install easydict
# 直接创建
config = EasyDict()
config.model = "ResNet"
config.lr = 0.001
# 字典转换
data = {"batch_size": 32, "optimizer": "Adam"}
config = EasyDict(data)
# 嵌套字典自动转换
nested_data = {"train": {"epochs": 10, "scheduler": "Cosine"}}
config = EasyDict(nested_data)
print(config.train.epochs) # 10
edata = EasyDict({"key": "value", "num_list": [1, 2, 3]})
# 点号访问
print(edata.key) # "value"
# 支持嵌套访问
edata.nested = {"a": {"b": 5}}
print(edata.nested.a.b) # 5
edata = EasyDict()
edata.new_key = "动态添加属性" # 自动扩展
edata["another_key"] = 100 # 兼容传统字典操作
del edata.new_key # 删除属性
# 原生字典与 EasyDict 互转
edata = EasyDict({"a": 1})
normal_dict = edict.to_dict() # 转回普通字典
# 避免拼写错误创建新属性
edata = EasyDict(strict=True)
edata.name = "Bob"
print(edata.naem) # 抛出 AttributeError(严格检测)
# 结合 argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--lr", type=float, default=0.001)
args = EasyDict(vars(parser.parse_args()))
print(f"Learning rate: {args.lr}")
import json
from easydict import EasyDict
with open("config.json") as f:
config = EasyDict(json.load(f))
print(config.model.hidden_size)
params = EasyDict(
batch_size=64,
optimizer=EasyDict(
name="Adam",
lr=0.001,
weight_decay=1e-4
)
)
print(params.optimizer.lr) # 0.001
edata = EasyDict({"invalid-key": 5})
print(edata["invalid-key"]) # 必须用方括号访问
import copy
original = {"a": {"b": 1}}
edata = EasyDict(original)
# 浅拷贝(修改会影响原始数据)
edata.a.b = 2
print(original) # {'a': {'b': 2}}
# 深拷贝
edata_deep = EasyDict(copy.deepcopy(original))
库名 | 特点 |
---|---|
munch |
支持更多特性(如默认值、YAML 序列化) |
attrdict |
兼容字典操作,提供递归访问保护 |
dotmap |
支持动态层级创建和列表自动转换 |
from easydict import EasyDict
import json
# 加载配置文件
with open("model_config.json") as f:
cfg = EasyDict(json.load(f))
# 修改配置
cfg.training.epochs = 100
cfg.optimizer.params.lr = 0.01
# 动态添加监控指标
cfg.monitor = EasyDict()
cfg.monitor.metrics = ["accuracy", "loss"]
# 转换为原生字典保存
output = cfg.to_dict()
with open("updated_config.json", "w") as f:
json.dump(output, f, indent=2)
easydict
是提升代码可读性的利器,尤其适用于配置管理、实验参数传递等场景。对于需要更高灵活性的项目,可结合 munch
或 attrdict
使用,但需注意其深拷贝和键名限制。