Control formatting of the argparse help argument list?

前端 未结 4 1024
再見小時候
再見小時候 2021-02-05 01:55
import argparse
parser = argparse.ArgumentParser(prog=\'tool\')
args = [(\'-u\', \'--upf\', \'ref. upf\', dict(required=\'True\')),
        (\'-s\', \'--skew\', \'ref. s         


        
4条回答
  •  一向
    一向 (楼主)
    2021-02-05 02:48

    Another approach: hijack sys.argv, check it for --help and -h, if found extract help text using argparse.format_help, massage it, print it, and exit.

    import  sys, re, argparse 
    
    RGX_MID_WS = re.compile(r'(\S)\s{2,}')
    
    def main(argv):
    
    #   note add_help = False
        parser = argparse.ArgumentParser(description = '%(prog)s: testing help mods', formatter_class= argparse.RawTextHelpFormatter, add_help = False)
    
        parser.add_argument('bar', nargs='+', help='two bars that need to be frobbled')
        parser.add_argument('--foo', action='store_true', help='foo the bars before frobbling\nfoo the bars before frobbling')
        parser.add_argument('--xxxxx', nargs=2, help='many xes')
        parser.add_argument('--bacon', help ='a striped food')
        parser.add_argument('--badger', help='in a striped pyjamas')
        parser.add_argument('--animal', dest='animal', choices=('zabra', 'donkey', 'bat') ,help ='could be one of these')
    
    #   may exit
        lArgs = help_manage(parser)
        args = parser.parse_args() # args = lArgs
    
        print('bars are: ', args.bar)
    
    
    def help_manage(parser):
        """
        check for -h, --help, -h in a single-letter cluster;
        if none found, return, otherwise clean up help text and exit
        """
    
        lArgs = sys.argv[1:]
        lArgsNoHelp = [sOpt for sOpt in lArgs if (not sOpt in ('--help', '-h')) and not (sOpt[0] == '-' and sOpt[1] != '-' and 'h' in sOpt)]
    
    #   no change?  then no --help params
        if len(lArgsNoHelp) == len(lArgs): return
    
        sHelp = parser.format_help()
    
    #   to see help as formated by argparse, uncomment: 
    #   print(sHelp)
    #   exit() 
    
        for sLine in sHelp.split('\n'): print(clean_line(sLine))
    
        exit() 
    
    def clean_line(sLine):
        """
        this is just an example, and goes nowhere near covering all possible
        argument properties
        """
    #   avoid messing with usage: lines
        if 'usage' in sLine: return sLine
        if sLine.startswith('  ') and '[' in sLine: return sLine
    
        if sLine.endswith(' arguments:'): return sLine + '\n'
    
        sLine = sLine.lstrip()
    
        sLine = RGX_MID_WS.sub(r'\1\n', sLine)
        if sLine.startswith('-'): sLine = '\n' + sLine
        return sLine.replace('{', '\n(can be: ').replace('}', ')').replace('\n\n', '\n')
    
    if __name__ == '__main__':
    
        bRes =  main(sys.argv[1:])
        sys.exit(bRes)
    

    Help without formatting:

    usage: argparse_fix_min2.py [--foo] [--xxxxx XXXXX XXXXX] [--bacon BACON]
                                    [--badger BADGER] [--animal {zabra,donkey,bat}]
                                    bar [bar ...]
    
        argparse_fix_min2.py: testing help mods
    
        positional arguments:
          bar                   two bars that need to be frobbled
    
        optional arguments:
          --foo                 foo the bars before frobbling
                                foo the bars before frobbling
          --xxxxx XXXXX XXXXX   many xes
          --bacon BACON         a striped food
          --badger BADGER       in a striped pyjamas
          --animal {zabra,donkey,bat}
                                could be one of these
    
    

    with formatting:

    usage: argparse_fix_min2.py [--foo] [--xxxxx XXXXX XXXXX] [--bacon BACON]
                                    [--badger BADGER] [--animal {zabra,donkey,bat}]
                                    bar [bar ...]
    
        argparse_fix_min2.py: testing help mods
    
        positional arguments:
    
        bar
        two bars that need to be frobbled
    
        optional arguments:
    
    
        --foo
        foo the bars before frobbling
        foo the bars before frobbling
    
        --xxxxx XXXXX XXXXX
        many xes
    
        --bacon BACON
        a striped food
    
        --badger BADGER
        in a striped pyjamas
    
        --animal 
        (can be: zabra,donkey,bat)
        could be one of these
    
        """
    
    

提交回复
热议问题