为argparse.ArgumentParser定制帮助格式化器的最佳方法是什么?



我使用argparse.ArgumentParser来解析参数并输出帮助文本。我想显示所有选项的默认值,并设置输出的宽度。我目前的解决方案似乎有点笨拙。有人能提出更好的解决方法吗?我目前的方法是定义argparse.ArgumentDefaultsHelpFormatter的子类,然后修改__init__的宽度属性。有什么更干净的主意吗?

# help class to set width of help to wrap at terminal width
class MyHelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
columns = -1
def __init__(self, *args, **kwargs):
if MyHelpFormatter.columns == -1:
try:
MyHelpFormatter.columns = os.get_terminal_size().columns
if 'width' not in kwargs:
kwargs['width'] = MyHelpFormatter.columns
except OSError:
# not in a terminal
pass
super().__init__(*args, **kwargs)

# instantiate argument parser
parser = argparse.ArgumentParser(description='program description',
formatter_class=MyHelpFormatter)

最后,由于冗长,我创建了一个简单的python文件argparser.py(请注意额外的'r'),并将其放在我的python路径中,现在我只是使用该文件而不是argparse。

'''
Extension to argparse to show default values for arguments and
print out help at proper width on screen.  Basically, it just adds the
MyHelpFormatter to the constructor for the argparse.ArgumentParser
class.
Example usage:
-------------------
import argparser
parser = argparser.ArgumentParser(description="Find and deal with autosave file")
parser.add_argument('-n', '--newer', type=int, default=0, help='how many days back to go, 0->forever')
args = parser.parse_args()
-------------------
Running this with -h would produce:
usage: <progname>.py [-h] [-n NEWER]
Find and deal with autosave file
optional arguments:
-h, --help            show this help message and exit
-n NEWER, --newer NEWER
how many days back to go, 0->forever (default: 0)
'''

import argparse
import os
import sys
if sys.version_info[0] < 3:
raise RuntimeError('Need python3 or greater to use argparser.py')

class MyHelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
columns = -1
def __init__(self, *args, **kwargs):
if MyHelpFormatter.columns == -1:
try:
MyHelpFormatter.columns = os.get_terminal_size().columns
if 'width' not in kwargs:
kwargs['width'] = MyHelpFormatter.columns
except OSError:
# not in a terminal
pass
super().__init__(*args, **kwargs)

class ArgumentParser(argparse.ArgumentParser):
def __init__(self, *args, **kwargs):
kwargs['formatter_class'] = MyHelpFormatter
super().__init__(*args, **kwargs)

相关内容

最新更新