【问题标题】:argparse: setting optional argument with value of mandatory argumentargparse:使用强制参数的值设置可选参数
【发布时间】:2012-08-14 00:21:38
【问题描述】:

使用 Python 的 argparse,我想添加一个可选参数,如果没有给出,则获取另一个(强制)参数的值。

parser.add_argument('filename',
                    metavar = 'FILE',
                    type    = str,
                    help    = 'input file'
                    )

parser.add_argument('--extra-file', '-f',
                    metavar = 'ANOTHER_FILE',
                    type    = str,
                    default = ,
                    help    = 'complementary file (default: FILE)'
                    )

我当然可以在解析参数后手动检查None,但是没有更pythonic的方法吗?

【问题讨论】:

    标签: python default-value argparse


    【解决方案1】:

    据我所知,没有比这更干净的方法了:

    ns = parser.parse_args()
    ns.extra_file = ns.extra_file if ns.extra_file else ns.filename
    

    (就像您在问题中提出的那样)。

    可以做一些custom action gymnastics similar to this,但我真的不认为这是值得的(或“pythonic”)。

    【讨论】:

    • ns.extra_file = ns.extra_file or ns.filename
    • @kindall 这适用于文件名,但想象一下对用户设置为False 的可选布尔参数执行此操作。你可以检查None
    【解决方案2】:

    这与您的原始选项集的语义略有不同,但可能对您有用:

    parse.add_argument('filename', action='append', dest='filenames')
    parse.add_argument('--extra-file', '-f', action='append', dest='filenames')
    args = parse.parse_args()
    

    这会将args.filename 替换为至少一个文件的列表args.filenames-f 将其参数附加到该列表。由于可以在位置参数之前在命令行上指定-f,因此您不能在args.filenames 中指定输入文件的任何特定顺序。


    另一种选择是放弃-f 选项,并使filename 成为多值位置参数:

    parse.add_argument('filenames', nargs='+')
    

    同样,args.filenames 将是至少一个文件名的列表。如果您的脚本有其他位置参数,这也会干扰。

    【讨论】:

    • filename 实际上是一个列表然后检查len(..)==2 是一个通用的想法。然而,考虑到问题的相对简单性,我想我会坚持检查 extra_file 是否为 None - 无论如何它不会改变程序的复杂性。
    猜你喜欢
    • 2014-04-15
    • 2018-04-29
    • 2019-04-13
    • 2015-11-07
    • 2014-09-09
    • 2023-04-02
    • 2011-05-27
    相关资源
    最近更新 更多