单元测试中创建对象列表:如何优化跳过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
相关产品推荐
相关产品推荐

