这是一个已知的问题,无论是关于SO还是Python错误/问题,都没有简单的解决方法。
https://bugs.python.org/issue15112
这是基本解析算法的结果。这将尝试解析位置信息,直到下一个可选标志。然后解析标记的选项(以及它需要的许多参数)。然后解析下一批位置,等等。
当解析器处理时
b,
c即使只有一个字符串,它也可以处理。
c不需要什么。这意味着
c它在第一次处理位置信息时就会“用完”。
In [50]: parser.parse_args(['one'])Out[50]: Namespace(a=None, b='one', c=None)In [51]: parser.parse_args(['one','two'])Out[51]: Namespace(a=None, b='one', c='two')In [52]: parser.parse_args(['one','-a','1','two'])usage: ipython3 [-h] [-a A] b [c]ipython3: error: unrecognized arguments: twoAn exception has occurred, use %tb to see the full traceback.SystemExit: 2/home/paul/.local/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2971: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)In [53]: parser.parse_known_args(['one','-a','1','two'])Out[53]: (Namespace(a='1', b='one', c=None), ['two'])
随着
c使用了(即使它只是获取默认的),没有什么消耗最后一个字符串。这是一个“额外”。parse_intermixed_args
Python 3.7添加了解决此问题的解析方法
parse_intermixed_args。
https://docs.python.org/3/library/argparse.html#intermixed-
parsing
In [447]: import argparse37In [448]: p = argparse37.ArgumentParser()In [449]: p.add_argument('pos1');In [450]: p.add_argument('-a');In [451]: p.add_argument('pos2', nargs='?');In [453]: p.parse_args('1 2 -a foo'.split())Out[453]: Namespace(a='foo', pos1='1', pos2='2')In [454]: p.parse_args('1 -a foo 2'.split())usage: ipython3 [-h] [-a A] pos1 [pos2]ipython3: error: unrecognized arguments: 2...In [455]: p.parse_intermixed_args('1 -a foo 2'.split())Out[455]: Namespace(a='foo', pos1='1', pos2='2')In [456]: p.parse_intermixed_args('1 2 -a foo'.split())Out[456]: Namespace(a='foo', pos1='1', pos2='2')
添加它是为了允许在“ *”位置中间标记 *** 作。但是最终在这种情况下以“?”开始工作 动作。请注意文档中的注意事项;它可能无法处理所有
argparse功能。
实际上,它会停用
positionals,执行a
parse_known_args来获取全部
optionals,然后
extras仅将解析为
positonals。有关
parse_known_intermixed_args详细信息,请参见的代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)