如何在python的ArgumentParser()中解析特殊字符?

时间:2015-08-10 20:14:56

标签: python-2.7 parsing arguments argparse

我正在使用一个应用程序,它接收诸如“:”分隔字符串之类的参数作为节点ID和可能包含多个特殊字符的流程名称。当我想解析参数时,由于某些特殊字符(例如*)的问题而触发错误。这是一个示例输入:

python flowapp.py --remove 00:00:02:84:75:e2:95:42 UDP*node-3_to_node-4*dp9000__@node-1

以下是我用于解析选项“--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'              

有没有办法告诉python的argparser将 - ,*或@等字符解释为特殊字符而不是“数学”运算符?

1 个答案:

答案 0 :(得分:0)

问题不在于特殊字符。 sys.argv将类似于:

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

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

但问题是同样的。