当前位置:  开发笔记 > 编程语言 > 正文

Python argparse:组合'choices','nargs'和'default'时输入不一致

如何解决《Pythonargparse:组合'choices','nargs'和'default'时输入不一致》经验,为你挑选了1个好方法。

我有以下python程序:

#!/usr/bin/env python

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg', choices=['foo', 'bar', 'baz'], default='foo', nargs='*')

args = parser.parse_args()

print(args)

如果我像这样调用程序:

./prog.py

输出是

Namespace(arg='foo')

但是如果我foo以参数的形式调用程序:

./prog.py foo

输出是

Namespace(arg=['foo'])

如何才能获得arg默认值list

我试过了

我尝试过设置,default=['foo']但结果是:

prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz')

hpaulj.. 6

这是一个旧的,但是开放的bug /问题的副本

http://bugs.python.org/issue9625 ( argparse: Problem with defaults for variable nargs when using choices)

A positional*得到一些特殊处理.choices如果您不提供值,则默认值始终通过测试.

将其与一个案例进行比较 optional

In [138]: p=argparse.ArgumentParser()
In [139]: a=p.add_argument('--arg',choices=['foo','bar','baz'],nargs='*')

In [140]: p.parse_args([])
Out[140]: Namespace(arg=None)
In [141]: a.default=['foo']
In [142]: p.parse_args([])
Out[142]: Namespace(arg=['foo'])

接受默认值而不进行测试:

In [143]: a.default=['xxx']
In [144]: p.parse_args([])
Out[144]: Namespace(arg=['xxx'])

相关代码是:

def _get_values(self, action, arg_strings):
    ...
    # when nargs='*' on a positional, if there were no command-line
    # args, use the default if it is anything other than None
    elif (not arg_strings and action.nargs == ZERO_OR_MORE and
          not action.option_strings):
        if action.default is not None:
            value = action.default
        else:
            value = arg_strings
        self._check_value(action, value)

建议的错误/问题补丁对此代码块进行了一些小改动.



1> hpaulj..:

这是一个旧的,但是开放的bug /问题的副本

http://bugs.python.org/issue9625 ( argparse: Problem with defaults for variable nargs when using choices)

A positional*得到一些特殊处理.choices如果您不提供值,则默认值始终通过测试.

将其与一个案例进行比较 optional

In [138]: p=argparse.ArgumentParser()
In [139]: a=p.add_argument('--arg',choices=['foo','bar','baz'],nargs='*')

In [140]: p.parse_args([])
Out[140]: Namespace(arg=None)
In [141]: a.default=['foo']
In [142]: p.parse_args([])
Out[142]: Namespace(arg=['foo'])

接受默认值而不进行测试:

In [143]: a.default=['xxx']
In [144]: p.parse_args([])
Out[144]: Namespace(arg=['xxx'])

相关代码是:

def _get_values(self, action, arg_strings):
    ...
    # when nargs='*' on a positional, if there were no command-line
    # args, use the default if it is anything other than None
    elif (not arg_strings and action.nargs == ZERO_OR_MORE and
          not action.option_strings):
        if action.default is not None:
            value = action.default
        else:
            value = arg_strings
        self._check_value(action, value)

建议的错误/问题补丁对此代码块进行了一些小改动.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有