argparse обновить выбор аргумента - PullRequest
0 голосов
/ 28 ноября 2018

Используя argparse, есть ли способ обновить опцию "choices" аргумента после его добавления в анализатор? Документация Argparse мало что дает при обновлении вариантов

import argparse

parser = argparse.ArgumentParser()

choices_list = ['A', 'B']
parser.add_argument('arg1', choices=choices_list)

# The list of choices now changes 
choices_list = ['A', 'C', 'D']

# Some code to update 'arg1' choices option ?
parser.???

Я пытался использовать 'parser.add_argument' с новым 'choices_list', но он создает повторяющиеся аргументы.

Использование Python 3.7

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Глядя на https://github.com/python/typeshed/blob/master/stdlib/2and3/argparse.pyi

# undocumented
class _ActionsContainer:

    def add_argument(self,
                 ...
                 **kwargs: Any) -> Action: ...

    def add_argument_group(self, *args: Any, **kwargs: Any) -> _ArgumentGroup: ...

Я не использую pycharm, но я озадачен, почему он будет жаловаться на add_argument, а не на add_argument_group.

В документации argparse не упоминается возвращенный объект Action, но это потому, что пользователям обычно не требуется доступ к нему.Но при интерактивном тестировании это довольно очевидно:

In [93]: import argparse
In [94]: parser = argparse.ArgumentParser()
In [95]: parser.add_argument('--foo', choices=['one','two'])
Out[95]: _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two'], help=None, metavar=None)
In [96]: _.choices
Out[96]: ['one', 'two']

Предыдущие ответы SO указывали, что Actions также доступны в «скрытом» списке _actions.Но в Python это «_» - просто неформальное соглашение;интерпретатор не обеспечивает конфиденциальность.

In [98]: parser._actions
Out[98]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two'], help=None, metavar=None)]

Отображается строковое представление объекта Action.Это наиболее часто используемые атрибуты.

Документация для argparse не является официальной ссылкой API;это слишком неполно для этого.Это более сложный документ с инструкциями, более сложный, чем учебное пособие, но не такой полный, как формальная спецификация.

0 голосов
/ 28 ноября 2018

Сам аргумент имеет атрибут choices, но это проще всего, если вы сохраните ссылку на аргумент вместо того, чтобы пытаться извлечь ее из самого синтаксического анализатора.(В противном случае вам нужно просмотреть закрытый атрибут parser._actions и попытаться определить, какой из них вам нужен.)

import argparse

parser = argparse.ArgumentParser()

choices_list = ['A', 'B']
arg1 = parser.add_argument('arg1', choices=choices_list)

arg1.choices = ['A', 'B', 'D']
...