我有一些代码,我想实现像git选项处理。
import argparse
def get_options():
parser = argparse.ArgumentParser(description='database maintance')
parser.add_argument('--database', default = 'series' )
subparsers = parser.add_subparsers(dest='operation', help='commands')
list_parser = subparsers.add_parser('list', help='list')
list_parser.add_argument('--tables', nargs='*', default=['all'], help="tables to list")
repair_parser = subparsers.add_parser('repair', help='repair data')
repair_parser.add_argument('date', help='Repair missing dates')
delete_parser = subparsers.add_parser('delete', help='delete data')
delete_parser.add_argument('table', nargs=1, default=argparse.SUPPRESS, help="table to delete date in")
delete_parser.add_argument('--tables', nargs='*', default=[], help="additional tables to apply delete")
opts = parser.parse_args()
print(opts)
return opts
if __name__ == '__main__':
opts = get_options()
这段代码的问题是,虽然你可以这样调用它。
$ ./maint.py list --tables t1 t2
Namespace(database='series', operation='list', tables=['t1', 't2'])
或者这样...
$ ./maint.py --database main list --tables t1 t2
Namespace(database='main', operation='list', tables=['t1', 't2'])
但你不能这样调用...
$ ./maint.py list --tables t1 t2 --database main
usage: maint.py [-h] [--database DATABASE] {list,repair,delete} ...
maint.py: error: unrecognized arguments: --database main
为了让它工作,我必须将toplevel解析器的所有参数添加到sub_parsers中。
list_parser.add_argument('--database', default = 'series' )
repair_parser.add_argument('--database', default = 'series' )
delete_parser.add_argument('--database', default = 'series' )
有没有更好的方法可以做到这一点,使toplevel选项可以被所有的sub_parsers调用?
你可以定义 --database
选项在一个单独的解析器中,它通过 parents
选项,然后可以在子命令之前或之后使用。
db = argparse.ArgumentParser(add_help=False)
db.add_argument("--database", default='series')
parser = argparse.ArgumentParser(description='database maintance', parents=[db])
subparsers = parser.add_subparsers(dest='operation', help='commands')
list_parser = subparsers.add_parser('list', parents=[db], help='list')
repair_parser = subparsers.add_parser('repair', parents=[db], help='repair data')
delete_parser = subparsers.add_parser('delete', parents=[db], help='delete data')
--database
然后可以在子命令之前或之后使用。