2015-08-10 3 views
0

Я работаю с приложением, которое получает параметры как «:» разделенные строки как идентификатор узла и имя потока, которое может содержать несколько специальных символов. Когда я хочу проанализировать аргументы, возникает ошибка из-за некоторых проблем со специальными символами типа *. Это пример ввод:Как разбирать специальные символы в аргументе ArgumentParser()?

python flowapp.py --remove 00:00:02:84:75:e2:95:42 UDP*node-3_to_node-4*[email protected] 

Вот код, я использую для разбора варианта «--remove»:

parser.add_argument("-r","--remove",help="remove the specified flow\ 
entry from a given node",nargs='2') 

Когда я исполняю приложение я получаю следующие ошибки:

... 
start_index = consume_optional(start_index) 
File "/usr/lib/python2.7/argparse.py", line 1858, in consume_optional 
arg_count = match_argument(action, selected_patterns) 
File "/usr/lib/python2.7/argparse.py", line 2011, in _match_argument 
nargs_pattern = self._get_nargs_pattern(action) 
File "/usr/lib/python2.7/argparse.py", line 2176, in _get_nargs_pattern 
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) 
TypeError: can't multiply sequence by non-int of type 'str'    

Есть ли способ описать argparser python для интерпретации символов как -, * или @ как специальные символы, а не «математические» операторы?

ответ

0

Проблема не в специальных символах. sys.argv будет что-то вроде:

['flowapp.py', '--remove', '00:00:02:84:75:e2:95:42', 'UDP*node-3_to_node-4*[email protected]'] 

который argparse не должно быть никаких проблем обработки.

Проблема с строки аргумента nargs:

parser.add_argument("-r","--remove",...,nargs='2') 

В рамках синтаксического анализа его строит шаблон согласования аргумент, который зависит от nargs значения:

nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) 
TypeError: can't multiply sequence by non-int of type 'str' 

Если nargs является одним специальных значений, таких как *, он должен быть целым числом. Вы дали ему строку.

parser.add_argument("-r","--remove",...,nargs=2) 

В других версиях argparse, вы могли бы получить другую ошибку:

ValueError: length of metavar tuple does not match nargs 

Но это та же самая проблема.

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