如何为Python的attr包模型设置动态默认值?
解决方案
要实现根据defaultsto参数加载对应预设配置的需求,可以通过attrs的动态工厂函数结合预设配置字典来完成,以下是具体实现:
完整代码示例
import attr from attrs import validators from delensalot.lerepi.core.validator import model # 定义预设配置,可根据需求扩展更多预设或属性 DEFAULT_PRESETS = { 'A': {'beam': '<beam value for default A>'}, 'B': {'beam': '<beam value for default B>'} } @attr.s class DLENSALOT_Data: """A root model element of the Dlensalot formalism. Attributes: beam: Beam configuration parameter """ beam = attr.ib(default=None) @attr.s class DLENSALOT_Model: """A root model element of the Dlensalot formalism. Attributes: defaultsto: Preset configuration key (supports 'A'/'B') data: Data model instance initialized with preset defaults """ # 添加defaultsto参数,带合法性验证 defaultsto = attr.ib( default='A', validator=validators.in_(DEFAULT_PRESETS.keys()) ) # 动态生成data实例,依赖defaultsto参数 data = attr.ib( factory=lambda self: DLENSALOT_Data(**DEFAULT_PRESETS[self.defaultsto]), takes_self=True, validator=model.data )
测试验证
# 加载预设A model_a = DLENSALOT_Model(defaultsto='A') print(model_a.data.beam) >>> <beam value for default A> # 加载预设B model_b = DLENSALOT_Model(defaultsto='B') print(model_b.data.beam) >>> <beam value for default B> # 使用默认预设A model_default = DLENSALOT_Model() print(model_default.data.beam) >>> <beam value for default A>
关键说明
- 预设配置字典:
DEFAULT_PRESETS集中管理所有预设的参数值,后续扩展新预设或修改属性值只需修改该字典,维护成本低。 - 合法性验证:通过
validators.in_确保用户传入的defaultsto只能是预设中的合法键,避免无效输入导致错误。 - 动态工厂函数:
data属性使用attr.Factory并设置takes_self=True,让工厂函数可以访问实例的defaultsto参数,动态生成对应配置的DLENSALOT_Data实例,完全契合attrs的设计范式。
内容的提问来源于stack exchange,提问作者Sebastian Belkner
相关产品推荐
相关产品推荐

