允许将带有nargs的位置命令行参数用标志分隔

允许将带有nargs的位置命令行参数用标志分隔,第1张

允许将带有nargs的位置命令行参数用标志分隔

这是一个已知的问题,无论是关于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
详细信息,请参见的代码。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存