如何解决当nargs ='*'时从argparse产生更好的帮助
和许多命令行工具一样,我的也接受可选的文件名。 Argparse似乎通过nargs='*'
支持此功能,该功能正按预期为我工作:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'files',help='file(s) to parse instead of stdin',nargs='*')
parser.parse_args()
但是,帮助输出很奇怪:
$ ./help.py -h
usage: help.py [-h] [files [files ...]]
如何避免嵌套的可选和重复参数名称?重复操作不会在[files ...]之外添加任何信息,这是在Unix上指示可选参数列表的传统方式:
$ grep --help
usage: grep [-abcDEFGHhIiJLlmnOoqRSSUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]
$ ls --help
Usage:
exa [options] [files...]
$ vim --help
Usage:
nvim [options] [file ...] Edit file(s)
感谢您的帮助。我正在尝试使用argparse,因为使用它似乎是Python的最佳实践,但是此帮助输出对我来说是一个大问题。
解决方法
此问题已在Python 3.9中修复,请参见https://www.hl.co.uk/shares/search-for-investments?stock_search_input=[your_keywords]和https://bugs.python.org/issue38438对其进行了修复。
您的代码会生成您期望在3.9上运行的使用情况消息:
Python 3.9.0 (default,Oct 12 2020,02:44:01)
[GCC 9.3.0] on linux
Type "help","copyright","credits" or "license" for more information.
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('files',help='file(s) to parse instead of stdin',nargs='*')
_StoreAction(option_strings=[],dest='files',nargs='*',const=None,default=None,type=None,choices=None,metavar=None)
>>> parser.print_help()
usage: [-h] [files ...]
,
对于Python 3.9之前的所有版本:
您可以通过传递usage="%(prog)s [options]"
字符串when instantiating ArgumentParser或更新现有实例的usage
属性来覆盖使用情况行。
如果想让它生成用法字符串,可以将其与ArgumentParser.format_usage()
结合使用,但是使用正则表达式或字符串替换仅替换nargs
选项。
例如:
import argparse
import re
parser = argparse.ArgumentParser()
parser.add_argument(
'files',)
usage = parser.format_usage()[7:] # remove "usage: " prefix
parser.usage = re.sub(r'\[(.+?) \[\1 ...\]\]',r'[\1 ...]',usage)
parser.parse_args()
产生:
usage: test.py [-h] [files ...]
positional arguments:
files file(s) to parse instead of stdin
optional arguments:
-h,--help show this help message and exit
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。