2016-09-07 3 views
-1

Я хотел бы передать произвольный набор аргументов в формате --arg1 value1 в мой скрипт python и получить их в словаре такого типа {'arg1': 'value1}. Я хочу использовать argparse для достижения этого. Функция parse_known_args допускает дополнительные аргументы, но их можно получить в виде простого списка и не назвать.Python parse_known_args с именованными аргументами

+0

вы можете просто определить параметр, используя метод 'add_argument'. 'parse_known_args' - это метод, который будет анализировать все параметры, определенные с помощью' add_argument', и возвращать оставшуюся командную строку, в то время как использование 'parse_args' приведет к возникновению ошибки, если есть оставшиеся аргументы. – Bakuriu

+0

Дополнительные аргументы могут быть любого имени/значения, неизвестного априори. –

+0

Тогда 'argparse' не имеет никакого шанса узнать, что с ним делать. Это точка 'parse_known_args': ** вы ** должны вручную обрабатывать оставшиеся аргументы, как вам угодно. – Bakuriu

ответ

2

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

class OptionAppend(Action): 
    def __call__(self, parser, namespace, values, option_string): 
     d = getattr(namespace, self.dest) 
     name, value = values 
     d[name] = value 

p.add_argument("-o", "--option", nargs=2, action=OptionAppend, default={}) 

Тогда вместо myscript --arg1 value1 --arg2 value2, можно было бы написать myscript -o arg1 value1 -o arg2value1, и после того, как args = parser.parse_args(), вы бы args.o == {'arg1': 'value1, 'arg2': 'value2'}.


Это несколько аналогично использованию списка или словаря содержит набор связанных переменных, вместо набора индивидуально названных переменных.

# Good 
v = [x, y, z] 
v = { 'key1': x, 'key2': y, 'key3': z} 
# Bad 
v1 = x 
v2 = y 
v3 = z 
0

Вопрос о работе с произвольными парами ключ/значение возникает несколько раз. argparse не имеет встроенного механизма для этого.

Is it possible to use argparse to capture an arbitrary set of optional arguments? (почти дубликат с мая прошлого года)

Ваша идея использования parse_know_args и затем делать свой собственный словарь строить из extras хорошо - и, возможно, самый простой. Как вы обрабатываете список дополнительных услуг, это будет зависеть от того, насколько хорошо себя ведут ваши пользователи (предсказуемые пары '--key', 'value'). Это в основном так же, как если бы вы разобрали sys.arv[1:] напрямую.

Если пользователь вводит такие данные, как --options key1:value1 key2=value2 "key3 value3", вы можете проанализировать эти пары в пользовательском классе Action (например, разделить строку на разделителе и т. Д.).

Вход как --options "{key1: value1, key2: value2}" может быть обработан как строка JSON, с функцией типа: type=json.load (мне нужно будет посмотреть это).

Смежные вопросы