CLIPS初学者:如何使用clipspy将Python字典导入为CLIPS事实
报错原因
- 第一个报错是Python字符串格式化语法不规范:使用
%占位符做格式化时,变量占位符后必须指定类型标识(字符串类型对应%s),你代码中的%(name)后缺失类型说明,Python会把后续的)误识别为格式字符,触发ValueError。 - 第二个隐性问题是
clipspy的API调用错误:Template.assert_fact原生支持字典/关键字参数传值,完全不需要手动拼接CLIPS格式的字符串。
修正后可运行代码
import clips template_string = """ (deftemplate person (slot name (type STRING)) (slot surname (type STRING))) """ person_dict = {'name': 'John', 'surname': 'Doe' } env = clips.Environment() env.build(template_string) template = env.find_template('person') # 直接对字典做解包传参即可 fact = template.assert_fact(**person_dict) env.run() # 遍历打印所有事实 for fact in env.facts(): print(fact)
运行输出结果
(initial-fact) (person (name "John") (surname "Doe"))
如果你确实需要手动拼接字符串实现(不推荐,容易出现格式错误和注入风险),修正后的写法如下:
# 补充%s类型说明符,同时给字符串值加双引号符合CLIPS语法 parstr = """(name "%(name)s")(surname "%(surname)s")""" % person_dict # 字符串格式的事实需要调用env.assert_string方法断言 fact = env.assert_string(f"(person {parstr})")
内容的提问来源于stack exchange,提问作者ANA
相关产品推荐
相关产品推荐

