我还没有在10年内使用argparse,但是我理解它以及我在下面所做的工作因为我希望它能够工作......但是随着我继续添加命令,这会变得更加复杂,解析器和子解析器。我想知道组织这个的最佳方法是什么?在我的脑海里,我应该能够看到文本中的命令序列几乎和我在图表中看到的一样清晰......但是每当我看着它,在离开一段时间后,我的脑子在我试图跟随时游动它。必须有更好的方法来组织这项权利吗?
import argparse
from modules import cli_tools
#LVL 1: create the top-level parser for the "sacs" command.
sacs_parser = argparse.ArgumentParser(prog = 'sacs', description = 'Master Command For Controlling SACS.')
sacs_subparsers = sacs_parser.add_subparsers(help='Management Module Selector.')
#LVL 2: create the second-level parsers for the "sacs [module]" commands.
csv_parser = sacs_subparsers.add_parser('csv', help='Generic CSV Management Module.')
am_parser = sacs_subparsers.add_parser('am', help='SACS Asset Management Module.')
mm_parser = sacs_subparsers.add_parser('mm', help='SACS Metric Management Module.')
#LVL 3: create the third-level subparser for the "sacs [module] [action]" commands.
csv_action_subparser = csv_parser.add_subparsers(help='The action to perform.')
mm_action_subparser = mm_parser.add_subparsers(help='The action to perform.')
#LVL 4: create the fourth-level subparser for the "sacs [module] [action] [type]" commands.
mm_create_parser = mm_action_subparser.add_parser('create', help='Used to Create a new event/asset input file.')
mm_create_type_parser = mm_create_parser.add_subparsers(help='The type of file to create.')
#LVL 5: create the fifth-level parser for the "sacs [module] [action] [type]" commands.
csv_reconcile_parser = csv_action_subparser.add_parser('reconcile', help='reconcile two csvs.')
mm_create_asset_parser = mm_create_type_parser.add_parser('assets', help='Create an Asset File.')
mm_create_asset_subtype_parser = mm_create_asset_parser.add_subparsers(help='The type of file to create.')
mm_create_event_parser = mm_create_type_parser.add_parser('events', help='Create an Event File.')
#LVL 6: create the sixth-level parser for the "sacs [module] [action] [type] [subtype]" commands.
mm_create_asset_uaid_parser = mm_create_asset_subtype_parser.add_parser('uaid', help='Create an Asset File with UAID as the primary key.')
mm_create_asset_vid_parser = mm_create_asset_subtype_parser.add_parser('vid', help='Create an Asset File with Vulnerability ID as the primary key.')
#COMMAND ARGS: Add Arguments to the final command "sacs csv reconcile [args]"
csv_reconcile_parser.add_argument('key', help='The name of the field that holds the unique ID to compare against.')
csv_reconcile_parser.add_argument('inputfile1', help='The master file (used when same record exists in both files).')
csv_reconcile_parser.add_argument('inputfile2', help='The secondary file, which is trumped by the master file.')
csv_reconcile_parser.add_argument('outputfile', help='The output file; note it will be overwritten if it exists.')
csv_reconcile_parser.set_defaults(func=cli_tools.csv_reconcile)
#COMMAND ARGS: Add Arguments to the final command "sacs mm create assets uaid [args]"
mm_create_asset_uaid_parser.add_argument('appmapp_file', help='The input file.')
mm_create_asset_uaid_parser.add_argument('output_file', help='The output file.')
mm_create_asset_uaid_parser.set_defaults(func=cli_tools.asset_create_uaid)
#COMMAND ARGS: Add Arguments to the final command "sacs mm create assets vid [args]"
mm_create_asset_vid_parser.add_argument('vulnerability_file', help='The input file.')
mm_create_asset_vid_parser.add_argument('appmapp_file', help='The output file.')
mm_create_asset_vid_parser.add_argument('output_file', help='The output file.')
mm_create_asset_vid_parser.set_defaults(func=cli_tools.asset_create_vid)
args = sacs_parser.parse_args()
args.func(args)
改善方式的潜在途径:
所有想法都摆在桌面上,我想看看其他人在设计复杂命令时如何处理这个问题。
答案 0 :(得分:0)
为Python代码添加清晰度的常用方法是在函数甚至类中打包步骤。 argparse
本身就是一组类。每个解析器(包括子分析器)都是argparse.ArgumentParser
个对象。每个add_argument
创建一个argparse.Action
子类对象。 add_subparsers
创建(并返回)处理子分析符的专用Action
子类。最后parse_args
返回argparse.Namespace
个对象。
不管是否适用于您的情况,我都不知道。您的代码是可读的,因此我很容易了解您在做什么。我从未见过有人使用过这么多级别的subparser。事实上,使用多个级别是一种新奇事物(从一些早期的SO问题来判断)。
我想强调argparse
的第一项工作是弄清楚用户想要什么。解析是第一优先。其次,它应该可以很容易地表达他们想要的东西。我想知道这种多级子分析是否易于使用。 argparse
在子分析符中分割help
的方式使得很难显示大概述。
在某些时候,大包开始编写自己的帮助,甚至自定义解析器以满足他们的需求。
您可以在CodeReview
上找到更好的答案。那里的常客似乎对代码组织和命名问题更感兴趣。 SO
更倾向于解决问题。如果主题过于专业化,我不鼓励推荐CR,但这更像是一个普通的Python问题而不是argparse
特定问题。但请阅读CR在一个问题中所期望的内容。
Multiple level argparse subparsers
Argparse with required subparser