问题:从现有argparse.ArgumentParser对象访问可能的参数的预期/官方方式是什么?
示例:我们假设以下上下文:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', '-f', type=str)
Run Code Online (Sandbox Code Playgroud)
在这里,我想获得以下允许参数列表:
['-h', '--foo', '--help', '-f']
Run Code Online (Sandbox Code Playgroud)
我找到了以下解决方法,它为我提供了诀窍
parser._option_string_actions.keys()
Run Code Online (Sandbox Code Playgroud)
但我对此并不满意,因为它涉及访问_未正式记录的成员.什么是这项任务的正确选择?
我认为没有“更好”的方法来实现你想要的。
如果您确实不想使用该_option_string_actions属性,您可以处理parser.format_usage()来检索选项,但这样做,您将只获得简短的选项名称。
如果您想要短选项名称和长选项名称,则可以parser.format_help()改为处理。
这个过程可以用一个非常简单的正则表达式来完成:-+\w+
import re
OPTION_RE = re.compile(r"-+\w+")
PARSER_HELP = """usage: test_args_2.py [-h] [--foo FOO] [--bar BAR]
optional arguments:
-h, --help show this help message and exit
--foo FOO, -f FOO a random options
--bar BAR, -b BAR a more random option
"""
options = set(OPTION_RE.findall(PARSER_HELP))
print(options)
# set(['-f', '-b', '--bar', '-h', '--help', '--foo'])
Run Code Online (Sandbox Code Playgroud)
或者您可以首先创建一个包含参数解析器配置的字典,然后从中构建 argmuent 解析器。这样的字典可以将选项名称作为键,将选项配置作为值。这样做,您可以通过使用itertools.chain扁平化的字典键访问选项列表:
import argparse
import itertools
parser_config = {
('--foo', '-f'): {"help": "a random options", "type": str},
('--bar', '-b'): {"help": "a more random option", "type": int, "default": 0}
}
parser = argparse.ArgumentParser()
for option, config in parser_config.items():
parser.add_argument(*option, **config)
print(parser.format_help())
# usage: test_args_2.py [-h] [--foo FOO] [--bar BAR]
#
# optional arguments:
# -h, --help show this help message and exit
# --foo FOO, -f FOO a random options
# --bar BAR, -b BAR a more random option
print(list(itertools.chain(*parser_config.keys())))
# ['--foo', '-f', '--bar', '-b']
Run Code Online (Sandbox Code Playgroud)
如果我不愿意使用,最后一种方法就是我会做的_option_string_actions。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |