【问题标题】:python argparse optional positional argument with detectable switch带有可检测开关的 python argparse 可选位置参数
【发布时间】:2023-08-16 20:29:02
【问题描述】:

我想像program -s <optional value> 这样调用我的程序。我想分配一个默认值,但也希望能够检测是否给出了-s 开关。 我有什么:

max_entries_shown = 10
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-s",
    nargs = '?',
    default = max_entries_shown)
args = parser.parse_args()

如果我没有在命令行上给-s,这给我一个值10 args.s,如果我指定-s 没有值,None。我想要的是args.s等于None,如果没有给定开关,args.s设置为默认值,-s给定,args.s等于custom_value,如果以program -s custom_value运行。我怎样才能做到这一点?

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    您必须使用const 而不是default。引用 argparse Python Docs 关于何时使用const

    当使用选项字符串(如 -f 或 --foo)和 nargs='?' 调用 add_argument() 时。这会创建一个可选参数,后面可以跟零个或一个命令行参数。解析命令行时,如果遇到选项字符串后没有命令行参数,则将假定 const 的值。有关示例,请参见 nargs 说明。

    此外,我添加了type=int,因为我假设您希望将输入视为 int。

    所以,你的代码应该是:

    max_entries_shown = 10
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-s",
        nargs = '?',
        const = max_entries_shown,
        type=int)
    args = parser.parse_args()
    

    此代码返回(带有打印参数)

    $ python parse.py
    Namespace(s=None)
    $ python parse.py -s
    Namespace(s=10)
    $ python parse.py -s 12
    Namespace(s=12)
    

    【讨论】: