Можно ли использовать argparse для захвата произвольного набора необязательных аргументов?

Можно ли использовать argparse для захвата произвольного набора необязательных аргументов?

Например, в качестве входных данных должны приниматься как следующие:

  • TypeError: принуждение к Unicode: нужна строка или буфер, список найден
  • Argparse: Требуемый аргумент 'y', если присутствует 'x'
  • Поддерживает ли argparse (python) взаимоисключающие группы аргументов?
  • type = dict в argparse.add_argument ()
  • Как сделать python argparse взаимоисключающими групповыми аргументами без префикса?
  • Argparse: Обязательные аргументы, перечисленные в разделе «необязательные аргументы»?
  •  python script.py required_arg1 --var1 value1 --var2 value2 --var3 value3 python script.py required_arg1 --varA valueA --var2 value2 --varB valueB 

    a priori Я не знаю, какие дополнительные аргументы будут указаны, но будет обрабатывать их соответственно.

  • Замена слова в списке со значением из dict
  • Сохранить список DataFrames для многостраничной таблицы Excel
  • Почему NumPy массивы так быстро?
  • Использование существующей базы данных в Django
  • Pandas: Как заполнить нулевые значения средним значением groupby?
  • Внедрение сервера
  • 2 Solutions collect form web for “Можно ли использовать argparse для захвата произвольного набора необязательных аргументов?”

    Это своего рода хакерский подход, но он работает очень хорошо:

    Проверьте, какие аргументы не добавлены и добавьте их

     parser=argparse.ArgumentParser() parser.add_argument("foo") parser.add_argument("-bar", type=int) #parser can have any arguments, whatever you want! parsed, unknown = parser.parse_known_args() #this is an 'internal' method # which returns 'parsed', the same as what parse_args() would return # and 'unknown', the remainder of that # the difference to parse_args() is that it does not exit when it finds redundant arguments for arg in unknown: if arg.startswith(("-", "--")): #you can pass any arguments to add_argument parser.add_argument(arg, type=<your type>, ...) args=parser.parse_args() 

    Например:

     python arbitrary_parser.py ha -bar 12 -lol huhu -rofl haha 

    Тогда результат будет

     args = Namespace(bar=12, foo='ha', lol='huhu', rofl='haha') 

    Возможное? возможно, но я бы не рекомендовал его. argparse – это не лучший инструмент для синтаксического анализа такого ввода, или, наоборот, это плохая спецификация аргументов с точки зрения argparse .

    Вы думали о том, как должна выглядеть линия usage ? Как объяснить это вашим пользователям?

    Как бы вы разобрали эту работу непосредственно из sys.argv ? Похоже, вы могли собрать 3 части:

      prog = sys.argv[0] arg1 = sys.argv[1] keys = sys.argv[2::2] # maybe strip -- off each values = sys.argv[3::2] kvdict = {k:v for k, v in zip(keys, values)} 

    Существуют и другие ответы на вопросы о парах генерических key:value . Вещи как:

      --args key1:value1 key2:value2 

    Это можно обработать с помощью nargs='*' и действия, которое разбивает каждую входную строку на : (или = ) и сохраняет вещи по key .

    Ваше требование в наименьшей степени применимо к использованию argparse потому что оно требует обхода всей идеи сопоставления флагов аргументов со строками в argv . Для этого требуется, каким-то образом, отключить весь обычный анализ argparse .

    Похоже, я предложил то же самое пару лет назад

    Разбор непредставленных аргументов

    или раньше

    Используя argparse для анализа аргументов формы "arg = val"

    Python - лучший язык программирования в мире.