一个灵活的配置注册和管理系统,用于简化项目中的配置管理。本项目提供了一个统一的配置注册机制,支持多种类型配置的管理,并具有参数验证、类型转换等功能。
- 支持多种类型配置的注册和管理
- 提供参数类型自动转换功能(支持基本类型、列表和字典)
- 内置参数冲突检测,避免不同类型配置间的参数名冲突
- 支持配置组合,方便统一管理多个配置
- 提供命令行参数解析功能,支持从命令行覆盖配置
- 支持 JSON 和 YAML 格式配置文件的读写
- 自动进行参数类型验证和转换
- 支持配置参数的文档注释提取
# 从源码安装
git clone https://github.com/yourusername/config_manager.git
cd config_manager
pip install -e .
# 或者直接安装
pip install config-managerfrom config_manager import ConfigRegistry
from dataclasses import dataclass
# 定义配置类
@ConfigRegistry.register("model", "mlp")
@dataclass
class MLPConfig:
"""MLP模型配置类
Args:
input_dim: 输入维度
output_dim: 输出维度
hidden_dims: 隐藏层维度列表
dropout_rate: Dropout比率
activation: 激活函数
use_batch_norm: 是否使用批归一化
"""
name: str = "mlp"
input_dim: int = 10
output_dim: int = 2
hidden_dims: list = [256, 128]
dropout_rate: float = 0.1
activation: str = "relu"
use_batch_norm: bool = True
# 获取配置类
config_cls = ConfigRegistry.get_config("model", "mlp")
# 创建配置实例
config = config_cls(
input_dim=784,
output_dim=10
)
# 查看配置参数说明
params = ConfigRegistry.get_config_params("model", "mlp")
print(params)系统支持多种类型的自动转换:
from config_manager import ConfigRegistry, ConfigHelper
from dataclasses import dataclass
@ConfigRegistry.register("training", "default")
@dataclass
class TrainingConfig:
"""训练配置类
Args:
batch_size: 批次大小
learning_rate: 学习率
use_cuda: 是否使用GPU
layer_sizes: 网络层大小列表
optimizer_params: 优化器参数
"""
name: str = "default"
batch_size: int = 32
learning_rate: float = 0.001
use_cuda: bool = True # 字符串 "true", "yes", "1" 会自动转换为 True
layer_sizes: list = [512, 256] # 字符串 "512,256" 会自动转换为 [512, 256]
optimizer_params: dict = {"lr": 0.001} # 字符串 '{"lr": 0.001}' 会被正确解析
# 创建配置并进行类型转换
config = TrainingConfig(
batch_size="64", # 字符串会自动转换为整数
use_cuda="yes", # 会自动转换为 True
layer_sizes="128,64,32" # 会自动转换为列表 [128, 64, 32]
)
# 执行类型转换
config = ConfigHelper.post_init(config)
print(config.batch_size, type(config.batch_size)) # 64 <class 'int'>
print(config.use_cuda, type(config.use_cuda)) # True <class 'bool'>
print(config.layer_sizes, type(config.layer_sizes)) # [128, 64, 32] <class 'list'>支持通过组合来管理多个配置:
from config_manager import CompositeConfig, ConfigHelper
# 创建各个配置
model_config = MLPConfig(input_dim=784, output_dim=10)
training_config = TrainingConfig(batch_size=32, learning_rate=0.001)
# 使用组合配置
composite = CompositeConfig(
model=model_config,
training=training_config
)
# 访问组合配置
print(composite.model.input_dim) # 784
print(composite.training.batch_size) # 32
print(composite.model_name) # "mlp"
# 保存完整配置
composite.save("experiment_config.json") # 或 .yaml支持 YAML 和 JSON 格式的配置文件。配置文件结构示例:
# 配置类型和名称
model_name: mlp
training_name: default
# 模型配置
model:
input_dim: 784
output_dim: 10
hidden_dims: [512, 256]
dropout_rate: 0.2
# 训练配置
training:
batch_size: 128
learning_rate: 0.001
epochs: 100
output_dir: "./output"支持通过命令行解析配置:
from config_manager import ConfigParser
# 初始化解析器
parser = ConfigParser()
# 解析命令行参数
configs = parser.parse_args()
# 如果是训练命令,获取配置
if configs is None:
return
if hasattr(configs, "model") and hasattr(configs, "training"):
# 获取模型和训练配置
model_config = configs.model
train_config = configs.training
print(f"模型配置: {model_config}")
print(f"训练配置: {train_config}")
# 这里可以根据配置构建模型和执行训练
# ...
if __name__ == "__main__":
main()命令行使用示例:
# 列出所有可用配置
python train.py list
# 查看特定配置的参数说明
python train.py params --type model --name mlp
# 从配置文件加载并执行训练
python train.py train --config config.yaml
# 从命令行参数创建配置并执行训练
python train.py train --model_name mlp --training_name default --params "hidden_dims=[1024,512]" "batch_size=64"配置注册中心,用于管理不同类型的配置类。
主要方法:
register(config_type, name): 注册配置类的装饰器get_config(config_type, name): 获取指定类型和名称的配置类list_available_configs(): 列出所有可用的配置类get_config_params(config_type, name): 获取指定配置类的参数说明validate_and_assign_params(config_types, params, valid_missing): 验证并分配参数到相应的配置类
配置解析器,用于从命令行参数或配置文件解析配置。
主要方法:
parse_args(args): 解析命令行参数load_config(config_path): 从文件加载配置parse_extra_params(params_list): 解析额外的参数列表
配置辅助工具,提供配置对象的序列化、反序列化和类型转换等功能。
主要方法:
to_dict(config_obj): 将配置对象转换为字典格式save(config_obj, path): 将配置保存到文件load(config_cls, path): 从文件加载配置post_init(config_obj): 配置对象初始化后的处理函数,执行参数的自动类型转换和验证
组合配置类,用于封装多个子配置,提供统一的访问接口。
主要方法:
__init__(**configs): 初始化组合配置类__getattr__(name): 通过属性访问子配置to_dict(): 将配置对象转换为字典格式save(path): 将配置保存到文件
以下是一个完整的训练脚本示例,展示如何在实际项目中使用配置管理系统:
from config_manager import ConfigRegistry, ConfigParser
from dataclasses import dataclass
# 定义配置类
@ConfigRegistry.register("model", "cnn")
@dataclass
class CNNConfig:
"""CNN模型配置
Args:
in_channels: 输入通道数
num_classes: 类别数量
kernel_size: 卷积核大小
"""
name: str = "cnn"
in_channels: int = 3
num_classes: int = 10
kernel_size: int = 3
@ConfigRegistry.register("training", "default")
@dataclass
class TrainingConfig:
"""训练配置
Args:
batch_size: 批次大小
learning_rate: 学习率
epochs: 训练轮数
output_dir: 输出目录
"""
name: str = "default"
batch_size: int = 32
learning_rate: float = 0.001
epochs: int = 10
output_dir: str = "./output"
def main():
# 解析命令行参数
parser = ConfigParser()
configs = parser.parse_args()
if configs is None:
return
if hasattr(configs, "model") and hasattr(configs, "training"):
# 获取模型和训练配置
model_config = configs.model
train_config = configs.training
print(f"模型配置: {model_config}")
print(f"训练配置: {train_config}")
# 这里可以根据配置构建模型和执行训练
# ...
if __name__ == "__main__":
main()本项目采用 MIT 许可证。详见 LICENSE 文件。