【问题标题】:Why doesn't my argparse show default values?为什么我的 argparse 不显示默认值?
【发布时间】:2016-07-29 03:35:21
【问题描述】:

根据this question,这个名为“parse_fail.py”的脚本在我输入时应该打印default=1:

python parse_fail.py --help 

在命令行上,但不是。为什么不呢?

#parse_fail.py

import argparse
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--test", type=int, dest='test', default=1)
parser.parse_args()
args_dict = vars(parser.parse_args())
locals().update(args_dict)
print test

当我运行这个脚本时,我得到:

$ python parser_fail.py  --help
usage: parser_fail.py [-h] [--test TEST]

optional arguments:
  -h, --help   show this help message and exit
  --test TEST

编辑:添加脚本的输出。

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    您没有得到该结果,因为您尚未定义变量 test。相反,您会收到一条错误消息,它实际上会告诉您这一点。您的代码中没有定义test,因此尝试打印它是错误的。

    你犯了两个错误。首先,您丢弃了parser.parse_args() 的返回值,这是您的命令行参数值的存储位置。要解决此问题,请将其分配给某个变量。

    args = parser.parse_args()
    

    其次,您尝试打印 test 而不是 args 的 test 属性(或您使用的任何变量)。要解决此问题,请打印 args.test 而不是 test。

    print args.test
    

    由于您只对 test 属性的值感兴趣,因此您可以将它们组合起来(当然,您通常会希望使用多个参数值,因此您可能不会在一个真正的脚本):

    print parser.parse_args().test
    

    把它放在一起,这是可行的:

    import argparse
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument("--test", type=int, dest='test', default=1)
    print parser.parse_args().test
    

    (我真的不知道您是如何从您提供的链接中获得您发布的代码的,该链接是关于在帮助消息中包含默认值,但希望无论如何这都会有所帮助。)

    【讨论】:

    • 使用该格式化程序类,默认值应出现在帮助消息中 - 但他没有向我们展示。
    • 这没有回答问题。问题不在于 args 对象的值,而在于为什么帮助字符串中缺少默认值。
    【解决方案2】:

    显然你需要包含一个非空的帮助字符串。

    这行得通:

    import argparse
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument("--test", type=int, dest='test', help="WHY NO DEFAULT???", default=1)
    parser.parse_args()
    args_dict = vars(parser.parse_args())
    locals().update(args_dict)
    print test
    
    
    
    $ python parser_fail.py -h
    usage: parser_fail.py [-h] [--test TEST]
    
    optional arguments:
      -h, --help   show this help message and exit
      --test TEST  WHY NO DEFAULT??? (default: 1)
    

    【讨论】:

    • 仅仅包含一个非空的帮助字符串对我不起作用(Python 2.7.3)。在实例化 argparse.ArgumentParser 时使用formatter_class=argparse.ArgumentDefaultsHelpFormatter 属性,如@kindall 的回答所示,就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2022-07-22
    • 2022-08-05
    • 2020-04-20
    • 2017-11-28
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多