0

私はこのYAMLファイルを持っています。必須キーとオプション キーがあり、「linux」、「http」などのオプション ブロックもあります。

---
project:
    name: lolproj
    url: http://wiki.tld/lolproj
contact:
    name: FooBar
    email: foobar@gmail.com
plugins:
    linux:
        settings:
            disk:
                critical: 90
                warning: 80
    http:
...

この方法でロードして検証しています:

from voluptuous import *

def main():

    with open('mytiny.yaml', 'r') as f:
        mon = yaml.safe_load(f)

    project =  {
        Required('name'): All(str, Length(min=5), msg="Must be a string!"),
        Required('url'): All(str, Length(min=5))
    }

    contact = {
        Required('name'): All(str, Length(min=5)),
        Required('email'): All(str, Length(min=5)),
    }

    disk_settings = {
            'warning': int,
            'critical': int,
    }

    plugins = ['linux','http','mysql']

    schema = Schema({
        Required('project'): project,
        Required('contact'): contact,
        Optional('plugins'): plugins,
            Optional('settings'): {
                Optional('disk'): disk_settings,
            }
    })

しかし、私はこのエラーが発生しています:

Traceback (most recent call last):
  File "./readmon.py", line 143, in <module>
    main()
  File "./readmon.py", line 43, in main
    schema(mon)
  File "/usr/local/lib/python2.7/site-packages/voluptuous.py", line 207, in __call__
    return self._compiled([], data)
  File "/usr/local/lib/python2.7/site-packages/voluptuous.py", line 386, in validate_dict
    return base_validate(path, iteritems(data), out)
  File "/usr/local/lib/python2.7/site-packages/voluptuous.py", line 287, in validate_mapping
    raise MultipleInvalid(errors)
voluptuous.MultipleInvalid: expected a list for dictionary value @ data['plugins']

だから、私は本当に悪いことをしているように見えます。これに関するヒントはありますか?問題は、次のようなものが欲しいということです:

['plugins']['linux']['settings']['disk']、または ['plugins']['http']['settings']['disk'] は 'linux'or'http ' オプションの設定を含む変数フィールド。

官能的なドキュメンテーションは初心者向けではありません:/

4

1 に答える 1

1

YAML レイアウトを次のように変更しました。

"
...


plugins:
    linux:
        disk:
            critical: 90
            warning: 80
        exec:
            exitcode: 0
    http:
        url: http://127.0.0.1
        port: 8080
        status: 200

...
"

そしてそれを次のように検証しました

''' PLUGINS SETUP
'''
disk_settings = {
    Optional('critical'): int,
    Optional('warning'): int,
    Optional('volume'): str,
}

exec_settings = {
    Optional('exitcode'): int,
}

linux_settings = {
    Optional('disk'): disk_settings,
    Optional('exec'): exec_settings,
}

http_settings = {
    Optional('url'): str,
    Optional('port'): int,
    Optional('status'): int,
}

plugins = {
    Optional('linux'): linux_settings,
    Optional('http'): http_settings,
}


''' CORE SCHEMA
'''
schema = Schema({
    Required('project'): project,
    Required('contact'): contact,
    Optional('plugins'): plugins,
})

それは働いています:)

于 2013-08-13T14:53:34.373 に答える