【问题标题】:argparse: let the same required argument be positional OR optionalargparse:让相同的必需参数是位置或可选的
【发布时间】:2016-10-12 00:41:27
【问题描述】:

我希望将必需的命令行参数作为位置参数或可选参数传递。例如,我希望从以下任何调用中执行相同的操作:

prog 10
prog -10
prog -n 10
prog --num 10

argparse 可以做到这一点吗?

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    对于互斥组,我可以创建一个合理的近似值:

    在交互式会话中:

    In [10]: parser=argparse.ArgumentParser()
    In [11]: grp=parser.add_mutually_exclusive_group(required=True)
    In [12]: a=grp.add_argument('pos',nargs='?',type=int,default=0)
    In [13]: b=grp.add_argument('-n','--num')
    

    grp 可以包含任意数量的选项和一个可选的位置。我为位置选择了不同的type,只是为了突出差异。

    只是位置值:

    In [14]: parser.parse_args(['10'])
    Out[14]: Namespace(num=None, pos=10)
    

    各种形式的可选:

    In [16]: parser.parse_args(['-n10'])
    Out[16]: Namespace(num='10', pos=0)
    In [17]: parser.parse_args(['--num=10'])
    Out[17]: Namespace(num='10', pos=0)
    In [18]: parser.parse_args(['--num','10'])
    Out[18]: Namespace(num='10', pos=0)
    

    测试组排他性

    In [25]: parser.parse_args(['--num=20','10'])
    usage: ipython3 [-h] [-n NUM] [pos]
    ipython3: error: argument pos: not allowed with argument -n/--num
    

    以及所需的组:

    In [26]: parser.parse_args([])
    usage: ipython3 [-h] [-n NUM] [pos]
    ipython3: error: one of the arguments pos -n/--num is required
    

    我尝试给位置相同的dest 作为可选 - 所以两者都会写信给num。但这会导致位置覆盖dest 的默认值(如果需要,我可以添加详细信息)

    In [19]: a.dest
    Out[19]: 'pos'
    In [20]: a.dest='num'
    In [21]: parser.parse_args(['--num','10'])
    Out[21]: Namespace(num=0)
    

    后解析代码必须以任何有意义的方式处理 args.posargs.num 值。

    '-10' 输入无法处理。好吧,我可以定义:

    parser.add_argument('-1')
    

    但结果可能不是你想要的:

    In [31]: parser.parse_args(['--num=20','-12'])
    Out[31]: Namespace(1='2', num='20', pos=0)
    

    总体而言,这个要求给程序员带来了不必要的困难。

    【讨论】:

    • 感谢您的回答。我同意你关于-10 表单的无用性。我在发帖时正在考虑 UNIX tail 命令,但这是一个非常具体的用法,最终不值得额外编码。我考虑过按照您的建议使用互斥组,但在我看来,这是一种规避argparse 的哲学(我不太喜欢)明确区分位置参数和可选参数的方法.最后,如果我决定保留argparse,我想我将只使用可选参数形式(-n--num)。
    猜你喜欢
    • 2018-08-10
    • 2014-10-14
    • 2015-06-16
    • 2020-05-03
    • 2014-08-02
    • 2011-05-27
    • 2018-04-29
    相关资源
    最近更新 更多