python
  • argparse
  • 2013-07-29 185 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')

    相關問題