python
  • argparse
  • 2013-07-29 241 views 2 likes 
    2

    我的灵感主要来自于。这里是我的闹钟应用程序的一部分:如何在不使用`-`或`--`的情况下创建参数?

    parser = argparse.ArgumentParser() 
    
    group = parser.add_mutually_exclusive_group() 
    
    group.add_argument(
        '--time', 
        metavar="HH:MM:SS", 
        help='time in 24 hour format separated by colon' 
    ) 
    
    group.add_argument(
        '--show', 
        action='store_true', 
        help='show the list of set alarms' 
    ) 
    
    alarm = parser.parse_args() 
    
    if alarm.time: 
        writeTimeToTheDatabase() 
    
    if alarm.show: 
        extractTimeFromDatabase() 
    

    此就开始运行得非常好,在这一点上,我从双方的观点删除--。我得到一个ValueError这是类似的东西:

    Traceback (most recent call last): 
        File "./alarm.py", line 65, in <module> 
        help='time in 24 hour format separated by colon' 
        File "/usr/lib/python2.7/argparse.py", line 1295, in add_argument 
        return self._add_action(action) 
        File "/usr/lib/python2.7/argparse.py", line 1515, in _add_action 
        raise ValueError(msg) 
    ValueError: mutually exclusive arguments must be optional 
    

    它谈论相互排斥的论点,但我认为回溯是不实际的问题密切相关。

    +0

    在初始化解析器以检查第一个参数之前,您可以有一个步骤。 – JBernardo

    +0

    @JBernardo你能否详细说明一下? –

    回答

    1

    如果你想使你的程序带参数的形式

    ./yourprog time 
    

    ./yourprog show 
    

    那么无论你想使用subparsers,或者你应该让你的程序采取单一的“命令”参数决定了它的功能。如果您希望timeshow命令采用自己的参数,则需要subparsers;否则,“命令”参数会更容易。只需删除连字符就可以使用您的参数,位置参数而不是命名的可选参数。这不是你想要的,它与“互斥”不兼容。

    1

    看来,实际上你不想要两个排他性的论点,而只是一个“命令”。这是一个位置争论的情况。

    parser.add_argument('command', choices=['time', 'show'], 
            help='one of \'time\' or \'show\'') 
    alarm = parser.parse_args() 
    
    if alarm.command == "time": 
        writeTimeToTheDatabase() 
    
    if alarm.command == "show": 
        extractTimeFromDatabase() 
    
    +0

    嗯..它是否在'./alarm.py time'之后指定HH:MM:SS? –

    +0

    为此,您必须使用nmax消耗两个参数,或创建第二个位置参数。无论哪种方式,如果你没有得到'时间'和'价值',你将不得不检查你自己的代码,或者如果命令不是'存储',就忽略第二个参数。 – Tiago

    1

    在你的初始设置,--time--show都是可选的参数,并通过将它们在一组,你告诉他们既不能在同一时间使用的解析器。

    通过删除--您已将它们转换为定位。默认情况下需要位置。把两者都放在一个互相排斥的群体中是没有意义的。

    你可以使time可选:

    group.add_argument('time', nargs='?') 
    

    showstore_true不能作出选择的,因为它需要0 ARGS。即使不是排他性组别,store_true位置也没有意义(尽管允许),因为它的值始终为true。所以它必须保持--show

    一组optional和一个可选的positional(是的,我在这里用两种意义上的'可选')是可能的,并且在某些情况下可能是有意义的。

    但正如其他人所暗示的那样,您可以改用subparsers。

    parser=argparse.ArgumentParser() 
    sp=parser.add_subparsers() 
    show=sp.add_parser('show') 
    show.add_argument('show',action='store_true') 
    time=sp.add_parser('time') 
    time.add_argument('time') 
    

    有了这个show产生Namespace(show=True),和time 12:34:56产生Namespace(time='12:34:56')

    相关问题