Bot Framework Python 如何向promptValidator传参或为PromptValidatorContext添加值
瀑布对话验证器传递自定义参数的实现方案
你可以通过提示调用时透传参数到验证上下文的方式实现需求,无需修改原有对话框注册逻辑,操作步骤如下:
步骤1:在验证步骤调用提示时传入存储的Value1
在触发TextPrompt的瀑布验证步骤中,将step_context.values["Value1"]存入PromptOptions的validations字段,该字段内容会直接透传给验证器:
async def validation_step(self, step_context: WaterfallStepContext) -> DialogTurnResult: # 构造提示配置,将自定义参数存入validations prompt_options = PromptOptions( prompt=MessageFactory.text("请输入您的年龄:"), validations={ "max_age": step_context.values["Value1"] } ) return await step_context.prompt("age", prompt_options)
步骤2:修改验证器从上下文读取参数
PromptValidatorContext的options属性可以直接拿到上一步传入的配置,直接提取参数使用即可:
@staticmethod async def age_validator(prompt_context: PromptValidatorContext) -> bool: # 从验证上下文读取透传的Value1,可设置默认值避免空值报错 max_age = prompt_context.options.validations.get("max_age", 120) # 注意TextPrompt返回的识别结果为字符串,需要转为数值再比较 input_age = int(prompt_context.recognized.value) if prompt_context.recognized.succeeded else 0 return ( prompt_context.recognized.succeeded and 0 < input_age < max_age )
可选方案:使用闭包绑定参数
如果需要在注册对话框时就固定传入参数,也可以将验证器改为闭包实现,动态生成绑定了指定参数的验证函数:
# 构造带自定义参数的验证器生成函数 def create_age_validator(max_age: int): async def age_validator(prompt_context: PromptValidatorContext) -> bool: input_age = int(prompt_context.recognized.value) if prompt_context.recognized.succeeded else 0 return ( prompt_context.recognized.succeeded and 0 < input_age < max_age ) return age_validator # 注册对话框时传入动态生成的验证器 self.add_dialog( TextPrompt( "age", create_age_validator(step_context.values["Value1"]) ) )
内容的提问来源于stack exchange,提问作者amoolya
相关产品推荐
相关产品推荐

