2016-08-17 3 views
1

Я пытаюсь назначить несколько атрибутов аргументов на основе их местоположения в списке атрибутов. Привести пример;присваивать переменную нескольким атрибутам argparse

import argparse 
import sys 

def args_options: 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-s', help='-s argument help', nargs=3) 
    parser.add_argument('-k', help='-k argument help', nargs=3) 
    arguments = parser.parse_args() 

    return arguments 

def assign_arg(): 
    args = args_options() 

    if args.s or args.k: 
     variable1 = args[1] # this is where I'm stuck as I know this won't work 
     variable2 = args[2] #^

Исходя из вышеизложенного, я пытаюсь проверить, либо arg.s или arg.k верно, и если да, то второй и третий атрибут в списке либо аргумента присваиваются переменным.

Можно ли это сделать с помощью python? Или мне нужно будет это сделать;

if arg.s: 
    variable1 = arg.s[1] 
    variable2 = arg.s[2] 
elif arg.k: 
    variable1 = arg.k[1] 
    variable2 = arg.k[2]  

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

+0

Ваши варианты не являются взаимоисключающей группой, что, если были указаны как '-s', так и' -k'? –

+0

Кажется, что аргументы для '-s' или' -k' обрабатываются одинаково, не имеет смысла просто превращать s/k в флаг и аргументы, обрабатываемые отдельно? –

ответ

0

Запустите анализатор с различными входами, и посмотреть на результаты:

In [108]: def args_options(argv=None): 
    ...:  parser = argparse.ArgumentParser() 
    ...:  parser.add_argument('-s', help='-s argument help', nargs=3) 
    ...:  parser.add_argument('-k', help='-k argument help', nargs=3) 
    ...:  arguments = parser.parse_args(argv) 
    ...:  return arguments 
    ...: 

без аргументов - как args.k и args.s являются None.

In [109]: args_options([]) 
Out[109]: Namespace(k=None, s=None) 

С -s и правильным числом аргументов, args.s список из 3-х строк.

In [110]: args_options(['-s','1','2','3']) 
Out[110]: Namespace(k=None, s=['1', '2', '3']) 

-k без аргументов - ошибка

In [111]: args_options(['-s','1','2','3', '-k']) 
usage: ipython3 [-h] [-s S S S] [-k K K K] 
ipython3: error: argument -k: expected 3 arguments 
An exception has occurred, use %tb to see the full traceback. 

SystemExit: 2 



In [112]: args_options(['-s','1','2','3', '-k','4','5','6']) 
Out[112]: Namespace(k=['4', '5', '6'], s=['1', '2', '3']) 

к и s - как в 3 элемента перечислены

В качестве примера испытаний мы можем сделать:

In [113]: args=args_options(['-k','1','2','3']) 
In [114]: args.s is None 
Out[114]: True 
In [115]: args.k is None 
Out[115]: False 
In [116]: a,b,c = args.k # unpack to variables 
In [117]: a 
Out[117]: '1' 
In [118]: b 
Out[118]: '2' 
In [119]: c 
Out[119]: '3' 

индексированный доступ из список также работает: args.k[2]

vars(args) создает словарь из объекта args, но я не думаю, что это облегчает доступ.

Большое сообщение - print args, чтобы узнать, что производит ваш парсер. Делайте это снова и снова, пока не поймете, что он делает и почему.

Вы могли бы дать -k в default=[], в продукции

In [123]: args=args_options(['-s','1','2','3']) 
In [124]: args 
Out[124]: Namespace(k=[], s=['1', '2', '3']) 

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

parser.add_argument('-k', '--ko', dest='something', default=[], nargs=3) 
Смежные вопросы