如何让Cerberus的normalize函数为嵌套字典填充默认值
实现方法
默认值不生效的原因:Cerberus 的normalized方法填充默认值的逻辑为:仅当字段的父级结构已存在,且字段本身配置了default参数时才会自动填充默认值。你当前的 schema 中仅为最内层的enabled设置了默认值,作为父级的api字段仅标记了required: True未配置默认值,所以不会自动生成api对应的字典结构,内层的enabled默认值自然无法触发填充。
你只需要在api字段的配置中添加default: {}即可实现需求,修改后的完整代码如下:
from yaml import load, Loader from cerberus import Validator text_schema = """ server: type: dict required: True schema: host: required: True type: string api: type: dict required: True default: {} # 新增该行配置 schema: enabled: type: boolean required: True default: True """ testyaml = """ server: host: hostname """ schema = load(text_schema, Loader=Loader) doc = load(testyaml, Loader=Loader) v = Validator(schema, purge_unknown=True) print(v.normalized(doc))
运行后输出结果和你预期的一致:
{'server': {'host': 'hostname', 'api': {'enabled': True}}}
补充说明:如果存在更多层级的嵌套字典,每一层需要自动生成的字典字段都需要配置default: {},才能触发下层字段的默认值填充。
内容的提问来源于stack exchange,提问作者pszafer
相关产品推荐
相关产品推荐

