2016-10-28 4 views
0

Есть ли способ использовать Argparse для захвата переключателя и его значения в качестве отдельных параметров?Переключатель захвата в доступном через Argparse

I.e.

python MyScript.py --myswitch 10 --yourswitch 'fubar' --herswitch True 

... результаты в чем-то вроде ...

MyScript.var1 == myswitch 
MyScript.var2 == 10 
MyScript.var3 == yourswitch 
MyScript.var4 == 'fubar' 
MyScript.var5 == herswitch 
MyScript.var6 == True 

... или ...

{'myswitch':10, 'yourswitch':'fubar', 'herswitch':True} 

=== РЕДАКТИРОВАТЬ ===
Это работает, используя только sys.argv. Есть ли способ сделать это с помощью argparse. Есть ли какая-либо польза от использования argparse, даже если есть способ?

def _parse_unknown_args(self, args): 
    """""" 
    scriptname = args.pop(0) # Just gets rid of it 
    args_dict = {} 
    flags_list = [] 
    key = None 

    for item in args: 
     # Must come first as a 'not' 
     if not item.startswith('-'): 
      # This means is a value, not a switch 
      # Try to add. If value was not preceded by a switch, error 
      if key is None: 
       # We got what appears t be a value before we got a switch 
       err = ''.join(["CorrectToppasPaths._parse_unknown_args: ", "A value without a switch was found. VALUE = '", item, "' (", str(args), ")."]) 
       raise RuntimeError(err) 
      else: 
       # Add it to the dict 
       args_dict[key] = item 
       key = None # RESET! 

     else: # '-' IS in item 
      # If there is ALREADY a switch, add to flags_list and reset 
      if key is not None: 
       flags_list.append(key) 
       key = None # RESET! 
      # Make it a key. always overrides. 
      key = item 
      while key.startswith('-'): key = key[1:] # Pop off the switch marker     

    # Last check. If key is not None here (at end of list) 
    # It was at the end. Add it to flags 
    if key is not None: flags_list.append(key) 

    return args_dict, flags_list 

===

bash-3.2# python correct_toppas_paths.py -a -b -c -set1 1 -set2 2 -d -e 
args_dict= {'set1': '1', 'set2': '2'} 
flags_list= ['a', 'b', 'c', 'd', 'e'] 

ответ

1

Правильно закодированы argparse анализатор будет производить Namespace объект как:

In [267]: args=argparse.Namespace(myswitch='10', yourswitch='fubar', herswitch=True) 

Это хорошая идея при тестировании, чтобы напечатать этот объект, например, print(args)

In [268]: args 
Out[268]: Namespace(herswitch=True, myswitch='10', yourswitch='fubar') 

Каждый из этих аргументов является атрибутом, который вы можете получить доступ с (при условии, что имена не что-то странное):

In [269]: args.myswitch 
Out[269]: '10' 

и документация указывает на то, что вы можете легко превратить его в словарь с vars:

In [270]: vars(args) 
Out[270]: {'herswitch': True, 'myswitch': '10', 'yourswitch': 'fubar'} 

в остальном это просто обычный кодирование Python - доступ к атрибутам объекта или ключей/значений в Dictiona гу.

+0

Спасибо. Итак, о чем я не понимаю; мы не будем знать, что такое «myswitch», «herswitch» и т. д. Они будут определены пользователем, набрав в командной строке. Я не видел, чтобы argparse мог принять ANY UNKNOWN switch (-u или --unknown) и добавить его в пространство имен. Имеет ли это смысл? – RightmireM

+0

Были вопросы о принятии произвольных пар ключ/значение, но это работает против намерений дизайна 'argparse' (и большинства других модулей синтаксического анализатора). Парсер дает вам, дизайнеру, контроль над тем, что принято. Это облегчает принятие '--myswitch' и отклоняет' --myswatch'. – hpaulj

+0

В http://stackoverflow.com/questions/27146262/create-variable-key-value-pairs-with-argparse-python Я предлагаю 'parse_known_args', за которым следует ваш собственный анализ списка' extras'. – hpaulj

 Смежные вопросы

  • Нет связанных вопросов^_^