Python argparse - два аргумента с переменной длиной - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть программа Python (в настоящее время Python 2.7, до сих пор не решенная относительно обновления до Python 3), которая получает аргументы через argparse, с одним позиционным аргументом, длина которого является переменной (nargs = "+"). Мне нужно добавить еще один параметр, который также имеет переменную длину.

Я видел, что argparse имеет некоторую поддержку двух аргументов переменной длины, но так как один из них в моем случае является позиционным, это означает, что он создает неоднозначность, если конечный пользователь передает новый параметр переменной длины в качестве последнего параметра перед позиционным аргументом. Изменение именованного позиционного аргумента нарушит существующие API, поэтому, к сожалению, это невозможно.

Я также подумал о возможности указать одну и ту же опцию несколько раз (например, - c val1, - c val2, - c val3 et c.), Что в значительной степени тоже самое, что и этот вопрос: Использование одного и того же параметра несколько раз в argparse Python , но на этот вопрос нет прямого ответа (только обходные пути, которые предполагают, что существует не более одного аргумента переменной длины, поэтому не очень полезны мне).

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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

ОК, я думаю, что action = 'append' может делать то, что я ищу.

0 голосов
/ 27 апреля 2020

Вы можете указать необязательное поле, для которого требуется флаг:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("A", nargs="+")
parser.add_argument("--b", nargs="+")

args = parser.parse_args(
  ["a", "b", "c", "d", "--b", "1", "2", "3"]
)

print(args)
# Namespace(A=['a', 'b', 'c', 'd'], b=['1', '2', '3'])

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


Как заметка, видя, что python 2.7 больше не поддерживается (по состоянию на 01.01.2020), вы можете перейти к python 3 и внести свои критические изменения сейчас.

...