【问题标题】:How to parse special characters in python's ArgumentParser()?如何解析 python 的 ArgumentParser() 中的特殊字符?
【发布时间】:2015-11-02 21:15:42
【问题描述】:

我正在使用一个应用程序,它接收像“:”分隔的字符串作为节点 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 将 -、* 或 @ 等字符解释为特殊字符而不是“数学”运算符?

【问题讨论】:

    标签: python-2.7 parsing arguments argparse


    【解决方案1】:

    问题不在于特殊字符。 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
    

    但这是同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多