Я пытаюсь выполнять математические операции между изображениями. Я определил (упрощенный вариант моего реального кода):Argparse: два позиционных аргумента с nargs = '+'
parser = argparse.ArgumentParser(description='Arithmetic operations on images')
parser.add_argument("input1", metavar='input1', action='store',
help='list of input images to operate with', nargs="+", type=str)
parser.add_argument("operation", metavar='operation', action='store', type=str,
help='type of operation (+,-,*,/) to be done', nargs=1)
parser.add_argument("input2",metavar='input2', action='store', nargs="+",
type=str, help='image (or value) with which to perform the operation on input1')
Этот код, производит:
arith.py -h
usage: arith.py [-h] input1 [input1 ...] operation input2 [input2 ...]
так же понимаю, что input1 может содержать один или несколько элементов, операция будет один один , а input2 может быть любым количеством элементов.
Проблема, конечно, состоит в том, что, имея два позиционных аргумента с неопределенным количеством элементов, argparse смущает то, что есть. Я попытался добавить опции = ["+", "-", "*", "/"] в "операцию", чтобы он знал, где провести разделение, но, похоже, argparse не может этого сделать. На самом деле, в argparse документации, говоря о «*» nargs = вы можете прочитать:
Обратите внимание, что, как правило, не имеет особого смысла, чтобы иметь больше, чем один позиционный аргумент с nargs = «*»
Я думал, что могу добавить вместе args.input1, args.operation и args.input2 и отделить себя от поиска «+», «-», «/», «*», но прежде чем делать что-то настолько уродливое. подумал о том, чтобы использовать коллективный ум.
Я не уверен, что 'argparse' подходит для того, что вы здесь делаете. Вероятно, было бы проще просто перейти через 'sys.argv' напрямую. – khelwood
Привет, Хелвуд. Собственно, я разбираю sys.argv, используя argparse. Это дает мне помощь для пользователя «бесплатно», и для меня все типы проверки и существующие переменные. Выполнение непосредственно sys.argv было бы подобно моему решению объединения пула ввода 1, работы и ввода2, а затем разделения. Возможность, но уродливая;). Спасибо, в любом случае! – Jblasco
'argparse' может построить такое справочное сообщение, но это не значит, что он может фактически анализировать аргументы так, как вы хотите. Если я назвал 'arith.py a b c d e f g', какой из них' operation'? Это может быть любой из 'b' через' f'. 'argparse' не имеет встроенного шаблона отслеживания обратного отслеживания; он просто обрабатывает аргументы слева направо жадным способом. – chepner