从ArgumentParser获取允许参数的正确方法

m8m*_*ble 7 python argparse

问题:从现有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)

但我对此并不满意,因为它涉及访问_未正式记录的成员.什么是这项任务的正确选择?

Try*_*yph 3

我认为没有“更好”的方法来实现你想要的。


如果您确实不想使用该_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