我正在寻找一个具有以下结构的参数解析器:
options [ 'backup', 'consistency_check', 'backup_and_consistency_check']
--database [ required ]
--action [ required choice from list options ]
--where_to_backup_to [ only required if --action is 'backup' ]
--what_file_to_consistency_check [ only required if --action is 'consistency_check']
--clean [ optional ]
--force [ optional if --clean is also in arguments ]
如何使用ArgumentParser模块实现可选参数,具体取决于作为另一个命令行参数的选择。
如果命令行参数是
,我希望使ArgParse失败--d database_name --a backup --what_file_to_consistency_check /var/tmp/file.bak
这是我到目前为止所得到的(我知道它很少但是如果我从一开始就没有完成它,我不想与subparsers完全错误的方向)
actions = ['backup', 'consistency_check', 'backup_and_consistency_check']
def create_parser():
parser = ArgumentParser(description='Parser for Backup / Consistency Check')
parser.add_argument('--database', '-d', dest='db', help='Database name', choices=get_active_database_list())
parser.add_argument('--action', '-a', dest='action', help='Action option', choices=actions)
# --where_to_backup_to [ only if action = backup ]
# --what_file_to_consistency_check [ only if action = cc ]
parser.add_argument('--clean', '-c', dest='clean', help='Clean')
# --force [ only available if --clean is also in arguments ]
return parser
答案 0 :(得分:1)
我认为使用动态选项解析器将action设置为位置参数是一个不错的选择:
if __name__ == "__main__":
action = sys.argv[1]
parser = create_parser(action)
args = parser.parse_args()
答案 1 :(得分:1)
执行此操作的传统方式看起来更像是:
def create_parser():
parser = ArgumentParser(description='Parser for Backup / Consistency Check')
parser.add_argument('--database', '-d', dest='db', help='Database name', choices=get_active_database_list())
parser.add_argument('--timeout', '-t', dest='timeout', help='Timeout limit (in minutes)')
subparsers = parser.add_subparsers()
parser_backup = subparsers.add_parser('backup', help='Run a backup')
parser_backup.set_defaults(action='backup') # or even pass the backup function itself, vs a string
parser_backup.add_argument('dest', help='Where to backup to') # where to backup to
parser_check = subparsers.add_parser('consistency_check', help='Run a consistency check')
parser_check.set_defaults(action='consistency_check')
parser_check.add_argument('source', help='What file to check for consistency')
return parser
...用法为:
# here, action='backup' and dest='/path/to/dest'
yourtool -d db -t 15 backup /path/to/dest
...或...
# here, action='consistency_check' and source='/path/to/content/to/check'
yourtool -d db -t 15 consistency_check /path/to/content/to/check
答案 2 :(得分:1)
如果subparser目前看起来太复杂了,我想你仍然可以在没有它们的情况下得到一个有用的解析器:
def create_parser():
parser = ArgumentParser(description='Parser for Backup / Consistency Check')
parser.add_argument('--database', '-d', dest='db', help='Database name', choices=get_active_database_list())
parser.add_argument('--action', '-a', help='Action option', choices=actions)
parser.add_argument('target', help='target for backup or check')
parser.add_argument('--clean', '-c', help='Clean') # default dest is 'clean'
parser.add_argument('--force', help='force clean')
return parser
如果需要database
,您可能需要为其添加required=True
参数。或者让它成为一个位置。否则,请考虑如果用户不提供,您将采取的措施。即如果args.db is None
?是否有可以使用的默认数据库?
看起来所有操作选择都需要文件或目录参数 - 备份或检查的目标。用户是否将其称为“--where_to_backup_to”或“--what_file_to_consistency_check”是否重要?通过在这里使用位置我要求他们给出某种名称,但是你可以根据'动作'解释它。
看起来force
只是clean
的更强版本。如果用户指定--force
但未指定--clean
,您认为他们想要什么?在这里,我接受两者并让你的代码选择哪个最有意义。
我的理念是解析器的主要目标是弄清楚用户想要什么。错误检查在防止模糊输入时最有用。但它不应该挑剔。简单的解析器设计通常比过于复杂的设计好。