#1971·outlines

可选 [T] 生成 Python DSL 容器内没有JSON 空

作者: ErenAta16创建于 2026年7月31日更新于 2026年8月23日
  • 尽可能清楚地说明这一问题

DSL容器内的 " 备选[T] " 和 " Union[T, no] " 生成Python拼写 " 无 " ,而不是JSON拼写 " null " ,因此产生的正则接受`json.loads ' 文件,拒绝和拒绝它接受的文件。

这是1942年的同一类错误(booleans生成'True'/'False'而不是' true'/'false')和1960年的同一类错误(日期/时间没有被引用),它是仍然使用Python语法的3个JSON文字中最后一个.

复制错误的步骤/代码

2zz
导入 json, re
从打入导入列表中选择
从大纲.type.dsl 导入 python types to terms, 到 regex

rx = 为  regex(python types to terms(列表[optional[int]])).
打印( rx)

用于 s 的 [" [1]", "[无]", "[nell]", "[1, 无]", "[1, null]" :
匹配 = re. full match(rx, s) 不是无
尝试 :
json. 荷载
无效 json=为真
除外:
无效 json=虚假
打印( f"{s: 12} matchs * matches! s: 5} 有效 json  valid json}" )

预期成果

生成的图案接受[null]'并拒绝[无]',与JSON 分析器接受的相匹配。

QQ 错误消息

没有例外。 一代默然错道:

\ [([(+-)]? (0| [1-9][0-9*)] \ (无))(,\ (([+-]? (0| [1-9][0-9*])) {(无)〕

[1] 匹配= True 有效 json= True
[无]相匹配=真 有效 json=假
[null] match=虚假有效 json= True
[1,无] 匹配= True 有效 json= False
[1, 无效] match= False 有效  json= True

每行两列意见不一的都是受限制的生成将模型引向无法解析的输出. `[null]',唯一正确的拼法是图案所禁止的。

其他集装箱和明确联盟拼法也是如此:

列表[可选 [str] ["a"]=ok [null]=拒绝 [无]=接受
列表[可选 [bool] [True]=ok [null]=被拒 [无]=被接受
dict[str,可选 [int]] {"k":1}=ok {"k":null}=被拒 {"k":无被接受
List [Union [int, no] [1]=ok [null]=拒绝 [无]=接受
  • 大纲/Python版本信息

取自 " main " at ' be2cd151855c64a81262c4daace2428400b109ff " ,Python 3.12,Windows。

解决错误的背景

该名词取自“src/outlines/types/dsl.py”中的“handle union”:

zz
若无:
# `无'是一个关键词,而不是字符串值:保持它是一个`Regex'(像
# `True'/`False'),所以当工会结束的时候,它不是JSON引用的
# 在一个容器类型中筑巢。
术语. append (Regex ("无"))

这一评论的推理有一半正确。 保持一个‘Regex'正确避免了‘"无'被引作一串,这将是不同的错误答案. 它所忽略的是,在JSON容器内,拼写本身必须改变,它所引用的先例True'/False'正是将第1942号拼写定为错误。

值得指出的是,独立案件是一个单独的问题,我将回避这个问题。 . . . . . . .

内容来源: dottxt-ai/outlines