应显式声明配置字段并校验,避免直接用**kwargs更新__dict__;推荐用dataclass(注意default_factory)或pydantic.basemodel自动校验类型与约束,延迟资源初始化,增强可维护性与错误提示。

用 **kwargs 接收配置但别直接塞进 __dict__
直接在 __init__ 里写 self.__dict__.update(kwargs) 看似省事,实际埋雷:参数名拼错不会报错、IDE 无法补全、类型检查失效、序列化时混入私有属性。更稳妥的做法是显式声明关键配置项,再用 **kwargs 收集可选参数并做校验。
- 先定义必需参数(如
host,port),带默认值的可选参数单独列出 - 剩余参数统一进
**options,然后用if key not in allowed_options:检查非法键 - 对关键字段做类型预处理,比如把
timeout转成float,避免后续反复转换
用 dataclass + field(default_factory=...) 控制默认行为
dataclass 天然适合配置类,但要注意:可变默认值(如空列表、空字典)必须用 default_factory,否则所有实例共享同一对象。另外,init=False 可隐藏运行时生成的字段(如连接池、缓存),避免被误传入初始化。
- 配置字段加
metadata={'help': '连接超时秒数'},方便后续生成文档或 CLI 提示 - 敏感字段(如
api_key)设为repr=False,防止日志泄露 - 需要动态计算的字段(如
base_url基于host和port)用@property或__post_init__
从环境变量或字典加载配置时,优先用 pydantic.BaseModel
当配置来源是 os.environ、config.json 或 argparse.Namespace 时,手写校验逻辑容易漏边界情况。用 pydantic.BaseModel 能自动完成类型转换、缺失检查、枚举约束和错误聚合。
- 定义模型时用
Field(..., env='DB_HOST')映射环境变量,支持大小写不敏感匹配 - 嵌套结构(如
database: {user: str, pool_size: int})直接用嵌套模型,不用手动dict.get('database', {}).get('user') - 启动时调用
Settings.parse_obj(config_dict)或Settings.parse_env(),错误信息自带字段路径,定位快
避免在 __init__ 里做重操作,把连接/验证延迟到首次使用
配置类初始化时就尝试连数据库、读文件或发 HTTP 请求,会导致单元测试难 mock、服务启动慢、错误堆栈不清晰。真正需要资源的地方(比如第一次调用 execute_query())再触发初始化。
- 把连接对象设为
self._client = None,用@property或私有方法封装懒加载逻辑 - 初始化失败时抛出明确异常(如
ConfigError("invalid SSL cert path")),而不是让下游收到AttributeError - 如果必须预热,提供显式方法如
validate()或connect(),而非藏在__init__里
retries 应该是正整数,log_level 必须在预设枚举中,这些不靠类型系统兜底,就得靠模型或校验逻辑守住。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











