为什么这不是Rx的有效模式?
我在一个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)中指定的键。