控制argparse帮助参数列表的格式?

Kau*_*han 26 python argparse

import argparse
parser = argparse.ArgumentParser(prog='tool')
args = [('-u', '--upf', 'ref. upf', dict(required='True')),
        ('-s', '--skew', 'ref. skew', {}),
        ('-m', '--model', 'ref. model', {})]
for args1, args2, desc, options in args:  
     parser.add_argument(args1, args2, help=desc, **options)

parser.print_help()
Run Code Online (Sandbox Code Playgroud)

输出:

usage: capcheck [-h] -u UPF [-s SKEW] [-m MODEL]

optional arguments:
  -h, --help            show this help message and exit
  -u UPF, --upf UPF     ref. upf
  -s SKEW, --skew SKEW  ref. skew
  -m MODEL, --model MODEL
                        ref. model
Run Code Online (Sandbox Code Playgroud)

我如何打印参考.-m MODEL, --model MODEL当我使用-h选项运行脚本时,模型在同一行而不是出现在单独的行上?

jfs*_*jfs 28

你可以提供formatter_class参数:

parser = argparse.ArgumentParser(prog='tool',
  formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=27))

args = [('-u', '--upf', 'ref. upf', dict(required='True')),
        ('-s', '--skew', 'ref. skew', {}),
        ('-m', '--model', 'ref. model', {})]
for args1, args2, desc, options in args:  
     parser.add_argument(args1, args2, help=desc, **options)

parser.print_help()
Run Code Online (Sandbox Code Playgroud)

注意:执行argparse.HelpFormatter是私有的,只有名称是公共的.因此,代码可能会在以后的版本中停止工作argparse.提交功能请求,以便max_help_positionhttp://bugs.python.org/上为自定义提供公共接口

产量

usage: tool [-h] -u UPF [-s SKEW] [-m MODEL]

optional arguments:
  -h, --help               show this help message and exit
  -u UPF, --upf UPF        ref. upf
  -s SKEW, --skew SKEW     ref. skew
  -m MODEL, --model MODEL  ref. model
Run Code Online (Sandbox Code Playgroud)


ber*_*ers 8

受到@jfs答案的启发,我想出了这个解决方案:

def make_wide(formatter, w=120, h=36):
    """Return a wider HelpFormatter, if possible."""
    try:
        # https://stackoverflow.com/a/5464440
        # beware: "Only the name of this class is considered a public API."
        kwargs = {'width': w, 'max_help_position': h}
        formatter(None, **kwargs)
        return lambda prog: formatter(prog, **kwargs)
    except TypeError:
        warnings.warn("argparse help formatter failed, falling back.")
        return formatter
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以用任何HelpFormatter你喜欢的方式来调用它:

parser = argparse.ArgumentParser(
    formatter_class=make_wide(argparse.ArgumentDefaultsHelpFormatter)
)
Run Code Online (Sandbox Code Playgroud)

或者

parser = argparse.ArgumentParser(
    formatter_class=make_wide(argparse.HelpFormatter, w=140, h=20)
)
Run Code Online (Sandbox Code Playgroud)

这样做的目的是确保实际上可以使用widthmax_help_position参数创建更宽的格式化程序。如果私有 API 发生变化,则由make_widea注明TypeError,并且格式化程序将原封不动地返回。这应该会使代码对于已部署的应用程序更加可靠。

我欢迎任何让这变得更加Pythonic的建议。