Argparse-不要用`nargs`捕获位置参数。

浏览:38日期:2024-03-06
如何解决Argparse-不要用`nargs`捕获位置参数。?

对此有一个错误报告:http ://bugs.python.org/issue9338

带有nargs =’?’,’*’或’+’的argparse可选参数不能跟位置

一个简单的(用户)修复方法是--用来将位置和可选位置分开:

./test.py -o 0.21 0.11 0.33 0.13 -- 100

我写了一个补丁,保留了一些用于位置的参数。但这不是一件小事。

至于更改用法行,最简单的方法就是编写自己的用法,例如:

usage: test.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -- positional

我不建议在用法格式化程序中添加逻辑以进行此类更改。我认为这太复杂了。

另一个快速解决方案是将此位置转换为(必需)可选。它使用户可以完全自由地订购,并可以减少混乱。如果您不想混淆“ requiredoptional”,则给它一个逻辑上的默认值。

usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -p POSITIONALusage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] [-p POS_WITH_DEFAULT]

对Help_Formatter的一个简单更改是仅按照定义的顺序列出参数。修改格式化程序行为的通常方法是将其子类化,并更改一种或两种方法。这些方法大多数都是“专用”(_前缀),因此您意识到将来的代码可能会(缓慢地)更改。

在此方法中,actions是参数列表的定义顺序。默认行为是从“ positionals”中拆分“optionals”,然后将列表结尾处的位置重新组合。还有其他代码可以处理需要换行的长行。通常,它将位置放在单独的行上。我已经省略了。

class Formatter(argparse.Helpformatter): # use defined argument order to display usage def _format_usage(self, usage, actions, groups, prefix):if prefix is None: prefix = ’usage: ’# if usage is specified, use thatif usage is not None: usage = usage % dict(prog=self._prog)# if no optionals or positionals are available, usage is just progelif usage is None and not actions: usage = ’%(prog)s’ % dict(prog=self._prog)elif usage is None: prog = ’%(prog)s’ % dict(prog=self._prog) # build full usage string action_usage = self._format_actions_usage(actions, groups) # NEW usage = ’ ’.join([s for s in [prog, action_usage] if s]) # omit the long line wrapping code# prefix with ’usage:’return ’%s%snn’ % (prefix, usage)parser = argparse.ArgumentParser(formatter_class=Formatter)

产生如下用法行:

usage: stack26985650.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]解决方法

我正在尝试编写一个函数wo,您可以通过argparse解析可变数量的参数-我知道我可以通过做到这一点nargs='+'。可悲的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)使位置参数处于最后位置。这导致我的位置参数被视为可选参数的一部分。

#!/usr/bin/pythonimport argparseparser = argparse.ArgumentParser()parser.add_argument('positional',help='my positional arg',type=int)parser.add_argument('-o','--optional',help='my optional arg',nargs=’+’,type=float)args = parser.parse_args()print args.positional,args.optional

运行它,如./test.py -h下面的用法说明所示:

usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional

但是如果我跑步./test.py -o 0.21 0.11 0.33 0.13 100给我

test.py: error: too few arguments

为了获得正确的参数解析,我必须运行 ./test.py 100 -o 0.21 0.11 0.33 0.13

那么我该如何:

使argparse重新格式化用法输出,以减少误导或更好:

告诉argparse-o如果列表中的最后一个元素不捕获可选参数的最后一个元素

相关文章: