pra*_*ent 5 python validation schema parsing docopt
有没有更好的方法来处理此验证:
#!/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)
Run Code Online (Sandbox Code Playgroud)
Vla*_*hev 10
我会做以下事情:
#!/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)
Run Code Online (Sandbox Code Playgroud)
虽然我希望架构可以使用单个架构表达相同,而不是两个.我将尝试在将来制作类似以下的模式:
schema = Schema({'ID': Use(int, error='ID should be an int'),
'FILE': Or(None, Use(open, error='FILE should be readable')),
object: object})
Run Code Online (Sandbox Code Playgroud)
通过object: object这意味着我只顾'ID'和'FILE'和所有其他键/值可以是任意的对象.
从版本0.2.0开始,架构现在可以正确处理这种情况:
schema = Schema({'ID': Use(int, error='ID should be an int'),
'FILE': Or(None, Use(open, error='FILE should be readable')),
object: object})
Run Code Online (Sandbox Code Playgroud)