Как получить список аргументов от ArgumentParser - PullRequest
1 голос
/ 20 июня 2020

Есть ли способ получить различные аргументы от объекта ArgumentParser?
Предположим, у меня есть следующий ArgumentParser:

parser = argparse.ArgumentParser(add_help=False, allow_abbrev=True)
parser.add_argument("--help", action="store_true", help="Provides help on usage.")
parser.add_argument("-u", "--user", help="A User, could be their tag or User ID.")
parser.add_argument("-hi", "--upper", type=int, default=100, help="The highest stat to include, this is inclusive. Should be an integer type.")
parser.add_argument("-lo", "--lower", type=int, default=0, help="The lowest stat to include, this is inclusive. Should be an integer type.")

# ...

В идеале мне нужен такой список:

[
    {"name": "help", "help":"Provides help on usage."},
    {"name": "user", "help":"A User, could be their tag or User ID."},
    {"name": "upper", "help":"The highest stat to include, this is inclusive. Should be an integer type."},
    {"name": "lower", "help":"The lowest stat to include, this is inclusive. Should be an integer type."}

    # ...
]

# or even better
[
    Argument,
    Argument,
    Argument,
    Argument

    # where you can use Argument.help or Argument.name
]

Лучший подход, который я вижу, - это использование parser.format_help() в чтобы получить результат использования, а затем разделить и проанализировать его до нужного формата, но должен быть другой подход.

Что я могу сделать, чтобы получить аргументы ArgumentParser?

1 Ответ

3 голосов
/ 20 июня 2020

parser._actions - это список экземпляров подклассов Action. Каждое действие имеет атрибут option_strings, который представляет собой список совпадающих строк. Вам нужно будет извлечь самую длинную строку опций, так как вам не нужны отдельные результаты для каждой короткой опции (например, и -u, и --user)

actions = []
for action in parser._actions:
    longest = ''
    for option in action.option_strings:
        option = option.lstrip('-')
        if len(option) > len(longest):
            longest = option
    actions.append({'name': longest, 'help': action.help})

Тогда список действий представляет собой список dicts с именем и клавишами справки.

...