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

如何为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>

关键说明

  1. 预设配置字典:DEFAULT_PRESETS集中管理所有预设的参数值,后续扩展新预设或修改属性值只需修改该字典,维护成本低。
  2. 合法性验证:通过validators.in_确保用户传入的defaultsto只能是预设中的合法键,避免无效输入导致错误。
  3. 动态工厂函数:data属性使用attr.Factory并设置takes_self=True,让工厂函数可以访问实例的defaultsto参数,动态生成对应配置的DLENSALOT_Data实例,完全契合attrs的设计范式。

内容的提问来源于stack exchange,提问作者Sebastian Belkner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:33:05