【问题标题】:argparse funneling positional arguments into multiple listsargparse 将位置参数汇集到多个列表中
【发布时间】:2018-10-12 13:46:06
【问题描述】:

我希望能够支持基于先前谓词进入不同列表的位置命令行参数。

例如,类似这样的命令:

mycommand one two three

会产生如下参数:

main_dest = ['one','two','three']
other_dest = []

但是像这样的命令:

mycommand one --other two three --main four five

会产生如下参数:

main_dest = ['one','four','five']
other_dest = ['two','three']

从概念上讲,我想要一个修改位置参数读取器的dest 的操作。

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    作为第一次尝试,这组操作似乎可以解决问题:

    In [73]: parser = argparse.ArgumentParser()
    In [74]: parser.add_argument('main', nargs='*');
    In [75]: parser.add_argument('other', nargs='*');
    In [76]: parser.add_argument('--main', action='append');
    In [77]: parser.add_argument('--other', action='append');
    
    In [78]: parser.print_usage()
    usage: ipython3 [-h] [--main MAIN] [--other OTHER]
                    [main [main ...]] [other [other ...]]
    
    In [79]: parser.parse_args('one two three'.split())
    Out[79]: Namespace(main=['one', 'two', 'three'], other=[])
    
    In [80]: parser.parse_args('one --other two --main three'.split())
    Out[80]: Namespace(main=['one', 'three'], other=['two'])
    

    74 和 76 都将 main 作为它们的 dest。我将append 用于标记的那些,这样它们就不会覆盖位置值。但是尽管usage 显示了什么,但位置只会在开始时起作用。如果放在末尾,它们将覆盖标记的值。而“其他”位置永远不会得到值 - 所以我应该省略它。

    所以可以玩这样的游戏,但我不确定它是否强大,或者对您的用户是否更容易。

    argparse: flatten the result of action='append'

    【讨论】:

    • 我编辑了我的问题,以便更清楚地表明我可能希望多个参数跟随流拆分。我之前尝试过该解决方案,不幸的是,甚至将nargs 添加到mainother 参数实际上并没有帮助(IIRC 我得到了一个列表列表结果或类似的奇怪的东西)。
    • 您可以稍后展平列表列表。您还可以在使用列表扩展的附加操作上编写变体。可能还需要其他自定义操作类。其他 SO argparse 答案以各种方式自定义了 Action 类。
    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 2015-07-25
    • 2011-05-27
    • 2015-07-12
    • 2011-11-20
    • 2013-03-29
    • 2021-08-01
    • 2011-05-27
    相关资源
    最近更新 更多