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

单元测试中创建对象列表:如何优化跳过None配置的对象创建逻辑?

优化单元测试中对象列表的创建逻辑

我想在单元测试里创建一个对象列表,但如果对应的配置是None就跳过创建该对象。以下是我的实现,有没有更优的写法?

def object_factory(config, model):
    if config is not None:
        yield model(**config)

def objects_factory(config1, config2):
    return list(
        chain(
            object_factory(config1, Model1),
            object_factory(config2, Model2)
        )
    )

输入示例与输出结果

示例1

输入:

objects_factory(None, {'pk': 1})

输出:

[Model2(pk=1)]

示例2

输入:

objects_factory({'pk': 1}, {'pk': 1})

输出:

[Model1(pk=1), Model2(pk=1)]

优化方案

你的实现逻辑没问题,但可以简化代码结构,同时提升扩展性:

方案1:简化逻辑,用列表推导替代生成器函数

直接去掉单独的object_factory,通过模型-配置配对+列表推导完成逻辑,代码更直观:

def objects_factory(config1, config2):
    # 建立模型与对应配置的配对关系
    model_config_pairs = [(Model1, config1), (Model2, config2)]
    # 过滤None配置并创建对象
    return [model(**config) for model, config in model_config_pairs if config is not None]

方案2:支持可变数量的模型配置对(更灵活)

如果后续需要新增更多模型配置,可改成接受可变参数的版本,不用修改函数结构:

def objects_factory(*model_config_pairs):
    """
    传入多个(模型类, 配置字典)的元组,自动跳过配置为None的对象创建
    """
    return [model(**config) for model, config in model_config_pairs if config is not None]

# 调用示例
objects_factory((Model1, config1), (Model2, config2))

优化点说明

  • 减少冗余代码:去掉了单独的生成器函数,逻辑更紧凑
  • 扩展性更强:新增模型配置时,只需添加配对项,无需修改函数核心逻辑
  • 可读性更高:列表推导比chain+生成器的组合更直观,一眼就能看出过滤和创建逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:05:18