Python Argparse和ArgumentDefaultsHelpFormatter。选择sys.stdin/stdout作为默认值时的默认值格式

Python Argparse和ArgumentDefaultsHelpFormatter。选择sys.stdin/stdout作为默认值时的默认值格式,python,stdout,stdin,argparse,Python,Stdout,Stdin,Argparse,我对使用argparse的ArgumentDefaultsHelpFormatter类格式化程序感兴趣(我的程序有几个子命令)。默认情况下,输入和输出参数分别设置为sys.stdin和sys.stdout。但是,对于用户来说,这两个参数的格式可能有点混乱(例如(默认值:',0x10028e0c0>处的模式“r”)。是否有一种方法可以专门轻松地更改这两个参数的输出格式,以获得类似“default:STDIN”或“default:STDOUT”的格式 多谢各位 import sys import a

我对使用argparse的ArgumentDefaultsHelpFormatter类格式化程序感兴趣(我的程序有几个子命令)。默认情况下,输入和输出参数分别设置为sys.stdin和sys.stdout。但是,对于用户来说,这两个参数的格式可能有点混乱(例如(默认值:',0x10028e0c0>处的模式“r”)。是否有一种方法可以专门轻松地更改这两个参数的输出格式,以获得类似“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)
用法:PROG[-h][--infle文件][--outfile文件]
[--which arg which_arg]
可选参数:
-h、 --帮助显示此帮助消息并退出
--填充文件,-i文件
输入文件/流。(默认值:)
--输出文件文件,-o文件
输出文件/流。(默认值:)
--任意arg任意arg,-w任意arg
更改某些内容(默认值:any)

您可以将ArgumentDefaultsHelpFormatter子类化以执行所需操作

来自argparse导入参数DefaultShelpFormatter,RawDescriptionHelpFormatter
类CustomFormatter(argparse.ArgumentDefaultsHelpFormatter,argparse.RawDescriptionHelpFormatter):
def_get_help_字符串(self,action):
帮助,帮助
如果“%”(默认值)不起作用。帮助:
如果action.default不是argparse.SUPPRESS:
默认值\u nargs=[argparse.OPTIONAL,argparse.ZERO\u或更多]
如果默认值中的action.option字符串或action.nargs:
如果类型(action.default)=类型(sys.stdin):
打印action.default.name
help++='(默认值:'+str(action.default.name)+')
其他:
帮助+='(默认值:%(默认值)s)'
回报帮助
parser=argparse.ArgumentParser(prog='prog',formatter\u 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)
可选参数:
-h、 --帮助显示此帮助消息并退出
--填充文件,-i文件
输入文件/流。(默认值:)
--输出文件文件,-o文件
输出文件/流。(默认值:)
--任意arg任意arg,-w任意arg
更改某些内容(默认值:any)

如果您给出的是
default='-'
而不是
sys.stdin
,则帮助显示将是

the input file/stream. (default: -)
也就是说,帮助显示默认字符串,但是
FileType
'-'
转换为stdin/out

正如
A.H
所示,您可以自定义
\u get\u help\u 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
参数中-仅添加
(默认值:%(默认值)s)

这意味着您可以通过调整自己的
help
行获得类似的效果,例如

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)')
换句话说,它可以为28个参数节省键入
(默认值:%(默认值)s)

如果您对自定义HelpFormatter类感到不舒服(尽管这是开发人员建议的,但需要注意),您可以调整自己的设置。例如,制作简单的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个参数,您可能已经做了大量的复制粘贴来定义它们,或者编写了各种帮助函数来简化设置。添加默认显示只是这些任务中的另一个。您可以在安装过程中进行,也可以通过自定义格式设置程序进行。使用默认格式设置程序并明确列出e帮助中的默认值?另一个选项是跳过
文件类型
,稍后自己打开文件。
文件类型
对于小脚本来说很方便,对于大脚本则不太好(在大脚本中,您需要更多地控制文件的打开时间)。我的程序包含大约30个子程序,所有子程序都有自己的参数集。因此,使用默认值的格式设置非常方便。我可以跳过文件类型,但在这种情况下,我不会从argparse文件检查中受益。然后自定义“\u get\u help\u string”方法即可。这就是此默认格式设置程序类所做的全部工作nyways.def
def
关闭后缩进。否则该概念有效。非常感谢您的帮助。这些也是非常好的解决方案。非常感谢您的帮助。