【问题标题】:Difference between --default and --store_const in argparseargparse 中 --default 和 --store_const 之间的区别
【发布时间】:2015-02-25 22:39:31
【问题描述】:

我在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 选项为参数设置默认值有何不同?

【问题讨论】:

    标签: python arguments argparse


    【解决方案1】:

    下面介绍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 参数中设置的任何值。如果参数不存在,则采用default 参数中指定的值。

    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
    

    使用const 而不使用default

    现在如果您没有指定default 怎么办?那么,在这种情况下,default 只是假设None 的值如下所示:

    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
    

    布尔参数的快捷方式

    现在您可以看到 constdefault 的值通常与布尔参数相反。为了方便起见,Python 提供了称为store_truestore_false 的快捷操作。 store_trueconst=Truedefault=False 相同。 store_false 反过来。

    【讨论】:

    • 这个答案非常有帮助,谢谢。
    • 对 argparse 的 constdefault 的出色而简洁的解释。谢谢。
    【解决方案2】:

    你从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')]。

    【讨论】:

    • add_argument('--foo', nargs='?', default='one', const='two') 太棒了
    猜你喜欢
    • 2012-09-03
    • 2014-01-03
    • 1970-01-01
    • 2019-08-20
    • 2017-01-09
    • 2016-03-15
    • 2019-04-17
    • 2017-12-06
    • 2019-11-11
    相关资源
    最近更新 更多