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

Ame*_*ina 12 python arguments argparse

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

' store_const' - 存储const关键字参数指定的值.(请注意,const关键字参数默认为相当无用的None.)' store_const'操作最常用于指定某种标志的可选参数.例如:

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

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

hpa*_*ulj 15

你得到了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)
Run Code Online (Sandbox Code Playgroud)

Action它创建的对象具有const=True属性和default=False属性.它也有nargs=0.这是一个store_const具有这些特殊价值的行动.

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

  • `add_argument('--foo', nargs='?', default='one', const='two')` 太棒了 (3认同)

Shi*_*hah 6

下面介绍的区别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
Run Code Online (Sandbox Code Playgroud)

没有价值的论点

例: --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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

布尔参数的快捷方式

快捷的操作store_truestore_false是一样使用store_const带有const参数值真假default分别参数值虚假与真实。