如何用Yamale验证YAML文件中MODELS_TO_TRY的引用合法性?
用Yamale验证MODELS_TO_TRY与MODEL_OPTIONS的关联
完全可以实现,核心是利用Yamale的自定义验证器功能,确保MODELS_TO_TRY中的每个元素都必须是MODEL_OPTIONS中已定义的键。
实现步骤:
编写Yamale Schema文件
先定义基础结构,同时为MODELS_TO_TRY的元素指定自定义验证器标签:MODEL_OPTIONS: map(str, str) # 定义模型选项为字符串键值对 MODELS_TO_TRY: list(include('model_ref')) # 列表元素引用自定义验证规则 --- model_ref: custom(model_exists) # 绑定自定义验证器标签实现自定义验证器类
继承Yamale的Validator类,重写validate方法,通过上下文获取MODEL_OPTIONS的键集合,检查当前元素是否合法:from yamale.validators import Validator class ModelExistsValidator(Validator): tag = 'model_exists' # 对应schema中的标签 def validate(self, value, path): # 从上下文获取整个YAML数据,提取MODEL_OPTIONS的键 model_options = self.context.get('MODEL_OPTIONS', {}) valid_model_names = set(model_options.keys()) # 检查当前模型名是否在有效集合中 if value not in valid_model_names: raise ValueError(f"模型 '{value}' 未在MODEL_OPTIONS中定义(路径:{path})")执行验证逻辑
加载schema和待验证的YAML文件,注册自定义验证器并传入上下文(把整个YAML数据传递给验证器):import yamale from yamale.schema import Schema # 加载schema和待验证数据 schema = Schema('schema.yaml') data = yamale.make_data('your_config.yaml') # 注册自定义验证器 custom_validators = {'model_exists': ModelExistsValidator} # 执行验证,传入上下文让验证器能获取MODEL_OPTIONS yamale.validate(schema, data, validators=custom_validators, context=data[0])
验证效果:
如果MODELS_TO_TRY中出现MODEL_OPTIONS里没有的模型(比如MODEL_4),验证会直接抛出ValueError,提示该模型未定义。
内容的提问来源于stack exchange,提问作者starfisher
相关产品推荐
相关产品推荐

