首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docopt +架构验证

docopt +架构验证
EN

Stack Overflow用户
提问于 2013-01-30 00:58:47
回答 1查看 2.5K关注 0票数 5

有没有更好的方法来处理这个验证:

代码语言:javascript
复制
#!/usr/bin/env python
""" command.

Usage:
  command start ID
  command finish ID FILE
  command (-h | --help)
  command (-v | --version)

Arguments:
  FILE     input file
  PATH     out directory

Options:
  -h --help     Show this screen.
  -v --version  Show version.
"""

from docopt import docopt
from schema import Schema, Use, SchemaError

if __name__ == '__main__':
    args = docopt(__doc__, version='command alpha')

    # Remove False or None keys from args dict
    for k, v in args.items():
        if (not v):
            args.pop(k)

    if 'start' in args:
        args.pop('start')
        schema = Schema({
            'FILE': Use(open, error='FILE should be readable'),
            'ID': Use(int, error='ID should be an int'),
        })
    elif 'finish' in args:
        args.pop('finish')
        schema = Schema({
            'FILE': Use(open, error='FILE should be readable'),
            'ID': Use(int, error='ID should be an int'),
        })

    try:
        args = schema.validate(args)
    except SchemaError as e:
        exit(e)

    print(args)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-30 02:59:12

我会做以下事情:

代码语言:javascript
复制
#!/usr/bin/env python
"""Command.

Usage:
  command start ID
  command finish ID FILE
  command (-h | --help)
  command (-v | --version)

Arguments:
  ID
  FILE     input file

Options:
  -h --help     Show this screen.
  -v --version  Show version.

"""
from docopt import docopt
from schema import Schema, Use, Or, SchemaError

if __name__ == '__main__':
    args = docopt(__doc__, version='command alpha')

    id_schema = Use(int, error='ID should be an int')
    file_schema = Or(None, Use(open, error='FILE should be readable'))
    try:
        args['ID'] = id_schema.validate(args['ID'])
        args['FILE'] = file_schema.validate(args['FILE'])
    except SchemaError as e:
        exit(e)

    print(args)

尽管我希望模式能够使用单个模式而不是两个模式来表达相同的内容。我将在将来尝试使模式成为可能,例如:

代码语言:javascript
复制
schema = Schema({'ID': Use(int, error='ID should be an int'),
                 'FILE': Or(None, Use(open, error='FILE should be readable')),
                 object: object})

object: object意味着我只关心'ID''FILE',所有其他的键/值都可以是任意的对象。

更新

从0.2.0版本开始,模式现在可以正确地处理这种情况:

代码语言:javascript
复制
schema = Schema({'ID': Use(int, error='ID should be an int'),
                 'FILE': Or(None, Use(open, error='FILE should be readable')),
                 object: object})
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14588098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档