为什么这不是Rx的有效模式?

6 投票
1 回答
1369 浏览
提问于 2025-04-15 12:34

我在一个Python项目中使用YAML作为配置文件格式。

最近我发现,Rx是唯一一个可以用来验证Python和YAML的模式工具。:-/ 而Kwalify虽然也支持YAML,但只适用于Ruby和Java。:(

我今天一直在看它们的文档,但就是写不出一个有效的模式来表示我的文件结构。求助!

我有以下这个YAML配置文件:

cmd:
  exec: mycmd
  aliases: [my, cmd]
  filter:
    sms: 'regex .*'

load:
  exec: load
  filter:
    sms: 'load: .*$'

echo:
  exec: echo %

我在表示嵌套结构时遇到了困难。我想要的是最外层的项目(在这个例子中是cmd、load和echo)是一个任意字符串,并且里面包含其他项目。'exec'是一个固定字符串,必须有;'aliases'和'filter'也是固定的,但可以选择性地有。'filter'里面又有一组必需和可选的项目。我该如何用Rx来表示这个呢?

到目前为止,我有以下这个模式(用YAML写的),但是Rx无法编译通过:

type: //rec
required:
  type: //rec
  required:
    exec: //str
  optional:
    aliases:
      type: //arr
      contents: //str
      length: {min: 1, max: 10}
    filter:
      type: //rec
      optional:
        sms: //str
        email: //str
        all: //str

在IPython中测试这个给我的结果是:

/Rx.py in make_schema(self, schema)
     68       raise Error('invalid schema argument to make_schema')
     69
---> 70     uri = self.expand_uri(schema["type"])
     71
     72     if not self.type_registry.get(uri): raise "unknown type %s" % uri

KeyError: 'type'

这让我觉得我可能在某个地方没有指定“类型”。:-S

有没有什么想法?

我真的很累,跟这个东西斗争……有没有其他方法可以写一个模式,并用它来验证我的配置文件?

提前谢谢你,

伊凡

1 个回答

4

试试这个:

type: //map
values:
  type: //rec
  required:
    exec: //str
  optional:
    aliases:
      type: //arr
      contents: //str
      length: {min: 1, max: 10}
    filter:
      type: //rec
      optional:
        sms: //str
        email: //str
        all: //str

一个地图(map)可以用任何字符串作为键,而一个记录(rec)只能包含在“必需”(required)和“可选”(optional)中指定的键。

撰写回答