代码之家  ›  专栏  ›  技术社区  ›  dputhier

Argparse和ArgumentDefaultsHelpFormatter。sys时默认值的格式。标准输入/标准输出被选择为默认值

  •  9
  • dputhier  · 技术社区  · 9 年前

    我有兴趣使用argparse的ArgumentDefaultsHelpFormatter类格式化程序(我的程序有几个子命令)。默认情况下,输入和输出参数设置为sys。标准输入和系统。标准输出。然而,这两个参数的格式可能会让用户有点困惑(例如(默认值:',模式'r'为0x10028e0c0>)。有没有一种方法可以具体而容易地更改这两个参数的输出格式,以获得类似“default:STDIN”或“default:STDOUT”的内容?

    非常感谢。

    import sys
    import argparse
    
    parser = argparse.ArgumentParser(prog='PROG', 
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    
    parser.add_argument('--infile',
                    '-i',
                    metavar='File',
                    help='The input file/stream.',
                    default=sys.stdin,
                    type=argparse.FileType('r'),
                    required=False)
    
    parser.add_argument('--outfile',
                    '-o',
                    metavar='File',
                    help='The output file/stream.',
                    default=sys.stdout,
                    type=argparse.FileType('r'),
                    required=False)
    
    parser.add_argument('--whatever-arg',
                    '-w',
                    type=str,
                    default='any',
                    help='Change something',
                    required=False)
    
    
    args = parser.parse_args()
    parser.print_help()
    

    其中给出:

    usage: PROG [-h] [--infile File] [--outfile File]
                [--whatever-arg WHATEVER_ARG]
    
    optional arguments:
      -h, --help            show this help message and exit
      --infile File, -i File
                            The input file/stream. (default: <open file '<stdin>',
                            mode 'r' at 0x10028e0c0>)
      --outfile File, -o File
                            The output file/stream. (default: <open file
                            '<stdout>', mode 'w' at 0x10028e150>)
      --whatever-arg WHATEVER_ARG, -w WHATEVER_ARG
                            Change something (default: any)
    
    2 回复  |  直到 9 年前
        1
  •  7
  •   Marcel Wilson    8 年前

    您可以将ArgumentDefaultsHelpFormatter子类化以执行您想要的操作。

    from argparse import ArgumentDefaultsHelpFormatter,RawDescriptionHelpFormatter
    
    class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter):
        def _get_help_string(self, action):
            help = action.help
            if '%(default)' not in action.help:
                if action.default is not argparse.SUPPRESS:
                    defaulting_nargs = [argparse.OPTIONAL, argparse.ZERO_OR_MORE]
                    if action.option_strings or action.nargs in defaulting_nargs:
                        if type(action.default) == type(sys.stdin):
                            print action.default.name
                            help += ' (default: ' + str(action.default.name) + ')'
                        else:
                            help += ' (default: %(default)s)'
            return help
    
    parser = argparse.ArgumentParser(prog='PROG', formatter_class=CustomFormatter)
    

    我的结果是:

    optional arguments:
      -h, --help            show this help message and exit
      --infile File, -i File
                            The input file/stream. (default: <stdin>)
      --outfile File, -o File
                            The output file/stream. (default: <stdout>)
      --whatever-arg WHATEVER_ARG, -w WHATEVER_ARG
                            Change something (default: any)
    
        2
  •  2
  •   hpaulj    9 年前

    如果你给 default='-' 而不是 sys.stdin ,帮助显示为

    the input file/stream. (default: -)
    

    也就是说,help显示默认字符串,但 FileType 转换 '-' 到标准输入/输出。

    A.H 显示您可以自定义 _get_help_string 方法从哪个类继承并不重要,因为修改该方法是ADHF的全部功能:

    class ArgumentDefaultsHelpFormatter(HelpFormatter):
        """...
        """
        def _get_help_string(self, action):
            help = action.help
            if '%(default)' not in action.help:
                if action.default is not SUPPRESS:
                    defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
                    if action.option_strings or action.nargs in defaulting_nargs:
                        help += ' (default: %(default)s)'
            return help
    

    请注意,此修改所做的只是将字符串添加到 help 参数-仅 (default: %(default)s)

    这意味着你可以通过调整自己的身体来获得类似的效果 帮助 线路,例如。

    parser.add_argument('--infile',
                    '-i',
                    metavar='File',
                    help='The input file/stream, (default: stdin).',
                    default='-',
                    type=argparse.FileType('r'))
    
    parser.add_argument('--whatever-arg',
                    '-w',
                    default='any',
                    help='Change something, (default: %(default)s)')
    

    换句话说,它可以让你省去打字 (默认值:%(默认值)s) 你的28个论点。

    如果您不喜欢自定义HelpFormatter类(尽管这是开发人员的建议,但有适当的注意事项),您可以调整自己的设置。例如,make simple helper函数将额外的字符串添加到每个帮助行:

    def foohelp(astr):
        return astr + ' (default: %(default)s)'
    
    arg1 = parser.add_argument('-f','--fooarg', help=foohelp('help string'))
    

    说到以编程方式更改设置,值得注意的是 add_argument 创建一个 Action 对象你可以保存一个链接,就像我在这里做的那样,并调整参数。

    arg1 = parser.add_argument('-f','--fooarg', help='help string')
    print arg1.help
    arg1.help = foohelp(arg1.help)  # modify help after creation
    print arg1.help
    

    对于30个参数,您可能已经做了很多copy-n-paste来定义它们,或者编写了各种帮助函数来简化设置。添加默认显示只是其中的另一项任务。您可以在设置过程中执行,也可以通过自定义格式设置工具执行。