Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Argparse,如何正确组织Argparse代码_Python_Argparse - Fatal编程技术网

Python Argparse,如何正确组织Argparse代码

Python Argparse,如何正确组织Argparse代码,python,argparse,Python,Argparse,我已经10年没有使用argparse了,但我理解它,我下面所做的工作正如我所希望的那样。。。但随着我继续添加命令、解析器和子解析器,这将变得更加复杂。我想知道最好的办法是什么?在我看来,我应该能够在文本中清楚地看到命令序列,就像我在图表中看到的一样。。。但每次我看着它,在离开一段时间后,我的大脑会随着我试图跟随它而游动。必须有更好的方法来组织这件事,对吗 实现更好方式的潜在途径: 解析器/子解析器重命名 更改语句的顺序 一种不影响python的缩进方式 所有的想法都摆在桌面上,我想看看其他人在设

我已经10年没有使用argparse了,但我理解它,我下面所做的工作正如我所希望的那样。。。但随着我继续添加命令、解析器和子解析器,这将变得更加复杂。我想知道最好的办法是什么?在我看来,我应该能够在文本中清楚地看到命令序列,就像我在图表中看到的一样。。。但每次我看着它,在离开一段时间后,我的大脑会随着我试图跟随它而游动。必须有更好的方法来组织这件事,对吗

实现更好方式的潜在途径:

  • 解析器/子解析器重命名
  • 更改语句的顺序
  • 一种不影响python的缩进方式

  • 所有的想法都摆在桌面上,我想看看其他人在设计复杂命令时是如何处理这些问题的。

    为Python代码增加清晰度的通常方法是将步骤打包到函数甚至类中
    argparse
    本身就是一组类。每个解析器(包括子解析器)都是
    argparse.ArgumentParser
    对象。每个
    add_参数
    创建一个
    argparse.Action
    子类对象。
    add_subparser
    创建(并返回)一个专门的
    Action
    子类来处理子parser。最后,
    parse_args
    返回一个
    argparse.Namespace
    对象

    我不知道这些是否适用于你的情况。你的代码是可读的,所以我很容易就知道你在做什么。我从来没见过有人用过这么多级别的潜艇。事实上,使用多个级别是一种新奇的做法(从前面的一些问题判断)

    我想强调的是,
    argparse
    的第一项工作是找出用户想要什么。解析是首要任务。其次,它应该使表达他们想要的东西变得容易。我想知道这个多级分段是否易于使用。
    argparse
    help
    在子parser之间分割的方式使得显示大的概览变得困难

    在某些时候,大型软件包开始编写自己的帮助,甚至定制解析器以满足他们的需要

    您可能会在
    CodeReview
    上得到更好的答案。那里的常客似乎对代码组织和命名问题更感兴趣<代码>因此更倾向于解决问题。如果主题过于专业化,我不鼓励推荐CR,但这更像是一个一般的Python问题,而不是一个
    argparse
    特定的问题。但请仔细阅读CR在一个问题中的期望


    为Python代码增加清晰度的常用方法是将步骤打包到函数甚至类中
    argparse
    本身就是一组类。每个解析器(包括子解析器)都是
    argparse.ArgumentParser
    对象。每个
    add_参数
    创建一个
    argparse.Action
    子类对象。
    add_subparser
    创建(并返回)一个专门的
    Action
    子类来处理子parser。最后,
    parse_args
    返回一个
    argparse.Namespace
    对象

    我不知道这些是否适用于你的情况。你的代码是可读的,所以我很容易就知道你在做什么。我从来没见过有人用过这么多级别的潜艇。事实上,使用多个级别是一种新奇的做法(从前面的一些问题判断)

    我想强调的是,
    argparse
    的第一项工作是找出用户想要什么。解析是首要任务。其次,它应该使表达他们想要的东西变得容易。我想知道这个多级分段是否易于使用。
    argparse
    help
    在子parser之间分割的方式使得显示大的概览变得困难

    在某些时候,大型软件包开始编写自己的帮助,甚至定制解析器以满足他们的需要

    您可能会在
    CodeReview
    上得到更好的答案。那里的常客似乎对代码组织和命名问题更感兴趣<代码>因此更倾向于解决问题。如果主题过于专业化,我不鼓励推荐CR,但这更像是一个一般的Python问题,而不是一个
    argparse
    特定的问题。但请仔细阅读CR在一个问题中的期望


    我会更改顺序并使用更短的变量名。创建解析器后,立即向其添加参数,并为解析器使用简短的通用名称。然后,您可以对每个子parser重复使用相同的短名称。我将更改顺序并使用较短的变量名。创建解析器后,立即向其添加参数,并为解析器使用简短的通用名称。然后,您可以为每个子Parser重复使用相同的短名称。感谢您提供的信息。。。会有助于你重新组织这个。。。我肯定要将游戏封装在函数中,但不确定使用此包的最佳方法。至于制作这样的多lvl命令,我在设计这个时考虑了zfs和zpool命令。。。argparse似乎使事情变得比它需要的更复杂,定制解析器将是非常棒的!唯一的一件事是,我真的不知道如何将main命令/python文件名之后的所有内容都转换成一个变量,以便我可以自定义解析它。。。会有助于你重新组织这个。。。我肯定要将游戏封装在函数中,但不确定使用此包的最佳方法。至于制作这样的多lvl命令,我在设计这个时考虑了zfs和zpool命令。。。argparse似乎使事情变得比它需要的更复杂,定制解析器将是非常棒的!唯一的问题是,我真的不知道如何将main命令/python文件名之后的所有内容都转换成一个变量,以便我可以自定义解析它。
    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)