Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Argparse-不要捕获带有'nargs'的位置参数。_Python_Argparse_Argument Passing - Fatal编程技术网

Python Argparse-不要捕获带有'nargs'的位置参数。

Python Argparse-不要捕获带有'nargs'的位置参数。,python,argparse,argument-passing,Python,Argparse,Argument Passing,我正在尝试编写一个函数wo,您可以通过argparse解析变量量的参数-我知道我可以通过nargs=“+”来完成这项工作。遗憾的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)将位置参数放在最后。这导致我的位置参数被捕获为可选参数的一部分 #!/usr/bin/python import argparse parser = argparse.ArgumentParser() parser.add_argument("positional", help="my posi

我正在尝试编写一个函数wo,您可以通过argparse解析变量量的参数-我知道我可以通过
nargs=“+”
来完成这项工作。遗憾的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)将位置参数放在最后。这导致我的位置参数被捕获为可选参数的一部分

#!/usr/bin/python
import argparse

parser = 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
为了正确解析args,我必须运行
/test.py 100-o 0.21 0.11 0.33 0.13

那么,我该如何:

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

  • 告诉argparse不要捕捉可选参数
    -o
    的最后一个元素(如果它是列表中的最后一个)


?< P> > P>而不是使用<代码> NARGS=“+”< /> >,考虑使用<代码> Actudio =“AppEnter”< /C>。这需要在每个数字前面传递

-o
,但除非您确实需要,否则它不会使用参数。

有一个错误报告:

nargs='?'、'*'或'+'的argparse optionals后面不能跟位置

一个简单的(用户)修复方法是使用
--
将postinals与optionals分开:

./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
我不建议为使用格式化程序添加逻辑来进行这种更改。我认为这会变得太复杂

另一个快速修复方法是将此位置转换为(必需的)可选位置。它为用户提供了完全的订单自由,并可能减少混乱。如果您不想混淆“required optional”,只需给它一个逻辑默认值

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

对Help_格式化程序的一个简单更改是简单地按照定义的顺序列出参数。修改格式化程序行为的常规方法是将其子类化,并更改一个或两个方法。这些方法中的大多数都是“private”(uuprefix),因此您这样做是因为您意识到未来的代码可能会(缓慢地)更改

在此方法中,
actions
是参数列表,按定义顺序排列。默认行为是将“optionals”从“positional”中拆分出来,并在列表末尾重新组合位置。还有其他代码处理需要换行的长行。通常,它将位置放在单独的行上。我忽略了这一点

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 that
        if usage is not None:
            usage = usage % dict(prog=self._prog)

        # if no optionals or positionals are available, usage is just prog
        elif 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%s\n\n' % (prefix, usage)

parser = argparse.ArgumentParser(formatter_class=Formatter) 
这将生成一个使用行,如:

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