【问题标题】:What's the point of having both action='store_true' and default=False in parser.add_argument?在 parser.add_argument 中同时包含 action='store_true' 和 default=False 有什么意义?
【发布时间】:2022-01-22 10:35:59
【问题描述】:

我一直在读这样的代码,

parser.add_argument('--name', action='store_true', default=False, help='XXX')

比如这个代码man-sf-emnlp/train.py - midas-research

但是当你已经设置了action='store_true',设置default=False又有什么意义呢?

【问题讨论】:

  • 明确而不是隐含是一种风格选择。这通常与Zen of Python 一致。
  • 请注意,Stack Overflow 问题应该是关于您实际面临的特定问题。你有什么问题吗?
  • @CharlesDuffy 这是一个特定的问题 - 它不一定是你实际面临的问题,询问你不了解的事情是完全可以的,问题只是必须是可以回答。
  • @Charles Duffy 抱歉,我现在没有什么大问题,只是作为初学者在理解这些深度学习代码方面有些困难。
  • 我已经回答了很多关于argparse 的问题,并且看不出这个问题有什么问题。

标签: python command-line command-line-interface command-line-arguments argparse


【解决方案1】:

store_true 子类的 __init__ 是:

class _StoreTrueAction(_StoreConstAction):

    def __init__(self,
                 option_strings,
                 dest,
                 default=False,
                 required=False,
                 help=None):
        super(_StoreTrueAction, self).__init__(
            option_strings=option_strings,
            dest=dest,
            const=True,
            default=default,
            required=required,
            help=help)

注意它设置了default=False。用户代码可以覆盖它,但有什么意义呢?这个子类只是一个store_const,其中defaultFalseconstTrue

add_argument 接受一些关键字参数并创建一个Action 子类对象。不同的actions 使用不同的参数组合。 add_argument 对必需或多余的参数采取随意的方法。也就是说,没有很多代码可以检查是否定义了正确的参数。

我会保留它,因为默认值是正确的。

【讨论】:

    【解决方案2】:

    没有意义。来自the docs

    'store_true''store_false' - 这些是 'store_const' 的特殊情况,分别用于存储值 TrueFalse。此外,它们分别创建FalseTrue 的默认值。

    (加粗)


    在 cmets 中,Charles Duffy 说,“明确而不是隐含是一种风格选择”,这是一个公平的观点,但这也意味着如果您正在编辑代码并且不小心与 action 不匹配和default,它会坏掉:

    >>> parser.add_argument('--name', action='store_true', default=True)
    >>> parser.parse_args(['--name'])  # Good
    Namespace(name=True)
    >>> parser.parse_args([])  # Bad
    Namespace(name=True)
    

    而且我认为隐含的默认值是显而易见的。

    【讨论】:

    • 不仅显而易见,而且是唯一合理的默认值。如果 --name 与使用 --namenot 没有什么不同,为什么还要使用它?
    • @chepner 不熟悉 argparse 的人可能会认为默认是未定义的,但我认为这不太可能。
    猜你喜欢
    • 2011-05-14
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2016-10-12
    • 2011-03-07
    • 2011-09-25
    • 2016-10-02
    相关资源
    最近更新 更多