argparse中--default和--store_const之间的区别

时间:2014-12-29 18:24:45

标签: python arguments argparse

我在argparse文档中阅读了以下内容:

  

'store_const' - 存储const关键字指定的值   论点。 (请注意,const关键字参数默认为   没有帮助。)“store_const”动作最常用   指定某种标志的可选参数。例如:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args('--foo'.split()) Namespace(foo=42)`

这与使用default选项设置参数的默认值有何不同?

2 个答案:

答案 0 :(得分:14)

parse_args(''.split())你得到了什么?我期待foo=None

现在在参数定义中添加default='39'

default是参数不存在时属性获得的值。 const是给定时获得的值。另请注意,仅当操作为const时(以及其他一些特殊情况),才允许store_const

请注意我定义store_true操作时会发生什么:

In [30]: p.add_argument('--bar', action='store_true')
Out[30]: _StoreTrueAction(option_strings=['--bar'], dest='bar', nargs=0, 
    const=True, default=False, type=None, choices=None, help=None, metavar=None)

它创建的Action对象具有const=True属性和default=False属性。它还有nargs=0。具有这些特殊值的store_const动作。

['高级'用户可以试用add_argument('--foo', nargs='?', default='one', const='two')]。

答案 1 :(得分:2)

以下描述了defaultstore_const之间的区别。由于命名不正确,这的确会造成混乱。

Python基本上支持两种类型的参数:

具有价值的论点

示例:--seed 42

在这里,您可以使用默认参数将参数设为默认值。但是,您要么必须完全提交参数,要么将其包含值,如下所示:

parser = argparse.ArgumentParser()
parser.add_argument('--seed', default=42)
parser.parse_args('--seed 20'.split()) # seed is now 20
parser.parse_args(''.split()) # seed is now 42
parser.parse_args('--seed'.split()) # ERROR, must supply argument value

无价值的论点

示例:--no-cuda

此处您无法为参数提供附加值,无论参数存在还是不存在。这些类型的参数需要action = "store_const",并且其值必须在const参数中提供,如下所示。您不能指定其他值。

parser = argparse.ArgumentParser()
parser.add_argument('--use-cuda', action='store_const', const=False, default=True)
parser.parse_args('--use-cuda'.split()) # use-cuda is now False
parser.parse_args(''.split()) # use-cuda is now True
parser.parse_args('--use-cuda True'.split()) # ERROR: unrecognized arguments: True

defaultconst一起使用

现在,如果上面出现参数丢失时,如果您想要True而不是None怎么办?您可以将defaultconst结合使用!

parser = argparse.ArgumentParser()
parser.add_argument('--use-cuda', action='store_const', const=False)
parser.parse_args('--use-cuda'.split()) # use-cuda is now False
parser.parse_args(''.split()) # use-cuda is now None
parser.parse_args('--use-cuda True'.split()) # ERROR: unrecognized arguments: True

布尔参数的快捷方式

快捷键操作store_truestore_false与分别使用store_const参数值True和False和const参数值False和True的default相同。