Как проанализировать аргументы argparser по значению - PullRequest
0 голосов
/ 30 января 2019

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

parser = argparse.ArgumentParser(description='foo 1.0')
parser.add_argument('-a', '--arch', help='specify the angle', nargs="+" choices=ch_list, required=True

Я передаю либо

+foo +bar +baz

, либо

-foo -bar -baz

или

foo bar baz

где foo bar baz - буквенные элементы

Какой самый элегантный способ сортировки аргументов?

Либо все должны иметь знак + или -подписывать или вообще не подписывать, если произошло смешивание аргументов, скрипт должен выдать ошибку и выйти.

1 Ответ

0 голосов
/ 30 января 2019

1) Вы не можете передать любое из -foo, -baz, -bar в качестве значений.Дефис заставит ArgParse интерпретировать его как флажок опции и выдаст ошибку.

2)

Какой самый элегантный способ сортировки аргументов?

Вы можете иметь

ch_list = ['foo', 'bar', 'baz', '+foo', '+bar', '+baz'] 

, которыйбудет гарантировать, что ничего за пределами этого списка не разрешено, но это не помешает пользователю ввести микс и совпадение различных форматов, скажем ./program --arch foo +baz +bar.

Чтобы предотвратить это, вам нужно будет самостоятельно проверить аргументы после parse_args().

  args = parser.parse_args()
  l = args.arch if args.arch is not None else []
  if len(l):
    has_plus = lambda x : x[0] == '+'
    first_has_plus = has_plus(l[0])
    for x in l:
      if first_has_plus ^ has_plus(x):
        print("INVALID")
        return
    print("PASSED")
...