Argparse 和 ArgumentDefaultsHelpFormatter。选择 sys.stdin/stdout 作为默认值时的默认值格式
Argparse and ArgumentDefaultsHelpFormatter. Formatting of default values when sys.stdin/stdout are selected as default
我有兴趣使用 argparse 的 ArgumentDefaultsHelpFormatter class 格式化程序(我的程序有几个子命令)。默认情况下,输入和输出参数分别设置为 sys.stdin 和 sys.stdout。然而,这两个参数的格式可能会让用户有点困惑(例如(默认值:',mode 'r' at 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)
您可以将 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)
如果您输入 default='-'
而不是 sys.stdin
,帮助显示将是
the input file/stream. (default: -)
即help显示默认字符串,但FileType
将'-'
转换为stdin/out。
如 A.H
所示,您可以自定义 _get_help_string
方法。您从哪个 class 继承并不重要,因为修改该方法就是 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)
这意味着您可以通过调整自己的 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 个参数节省了键入 (default: %(default)s)
的时间。
如果您对自定义 HelpFormatter class 感到不自在(尽管这是开发人员的建议 - 但要小心谨慎),您可以调整自己的设置。例如,制作简单的辅助函数,将额外的字符串添加到每个帮助行:
def foohelp(astr):
return astr + ' (default: %(default)s)'
arg1 = parser.add_argument('-f','--fooarg', help=foohelp('help string'))
谈到以编程方式更改设置,值得注意的是 add_argument
创建了一个 Action
对象。您可以将 link 保存到其中,就像我在此处所做的那样,并调整参数。
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 来定义它们,或者编写了各种辅助函数来简化设置。添加默认显示只是其中的一项任务。您可以在设置期间执行此操作,也可以通过自定义格式化程序执行此操作。
我有兴趣使用 argparse 的 ArgumentDefaultsHelpFormatter class 格式化程序(我的程序有几个子命令)。默认情况下,输入和输出参数分别设置为 sys.stdin 和 sys.stdout。然而,这两个参数的格式可能会让用户有点困惑(例如(默认值:',mode 'r' at 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)
您可以将 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)
如果您输入 default='-'
而不是 sys.stdin
,帮助显示将是
the input file/stream. (default: -)
即help显示默认字符串,但FileType
将'-'
转换为stdin/out。
如 A.H
所示,您可以自定义 _get_help_string
方法。您从哪个 class 继承并不重要,因为修改该方法就是 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)
这意味着您可以通过调整自己的 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 个参数节省了键入 (default: %(default)s)
的时间。
如果您对自定义 HelpFormatter class 感到不自在(尽管这是开发人员的建议 - 但要小心谨慎),您可以调整自己的设置。例如,制作简单的辅助函数,将额外的字符串添加到每个帮助行:
def foohelp(astr):
return astr + ' (default: %(default)s)'
arg1 = parser.add_argument('-f','--fooarg', help=foohelp('help string'))
谈到以编程方式更改设置,值得注意的是 add_argument
创建了一个 Action
对象。您可以将 link 保存到其中,就像我在此处所做的那样,并调整参数。
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 来定义它们,或者编写了各种辅助函数来简化设置。添加默认显示只是其中的一项任务。您可以在设置期间执行此操作,也可以通过自定义格式化程序执行此操作。