【问题标题】:Why isn't this a valid schema for Rx?为什么这不是 Rx 的有效模式?
【发布时间】:2010-11-06 21:12:46
【问题描述】:

我使用 YAML 作为 Python 项目的配置文件格式。

最近我发现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' 也是固定的,但应该是可选的。过滤器又具有另一组必需项和可选项。我应该如何用 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

有什么想法吗?

我已经厌倦了与这件事作斗争......还有其他方法可以编写模式并使用它来验证我的配置文件吗?

提前致谢,

伊万

【问题讨论】:

    标签: python schema yaml


    【解决方案1】:

    试试这个:

    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' 中指定的键。

    【讨论】:

    • 是的,行得通!我从没想过以这种方式使用//map;过于关注 //rec 类型。 Rx 的作者 Ricardo Signes 也给我发了一个有用的回复,我想我会与将来可能遇到类似问题的任何人分享一个截图:pastebin.com/f13421133。我希望他不介意我这样做。谢谢你的回答,丹尼尔!你救了我的一天! :D
    • 我正在尝试在我的项目中使用这个模块,但正如@imiric 所说,文档并不友好。你能分享一些使用这个的示例python代码吗?
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多