2015-03-08 59 views
0

我讀過一個similar question在SO上詢問,它沒有解決我自己的問題。爲了說明目的,說我有使用argpase一個Python程序,它提供了兩個子命令:copyresume指定具有位置參數的缺省子命令

prog copy src dest # src, dest positional, required 
prog resume id  # id positional, required 

然而,最自然的方式來調用「複製」命令明確給出了copy子,那就是我希望的:

prog src dest 

會做默認copy行動,同時還保持有兩個subparsers的好處,每處理一組不同的參數。是否可以使用​​包?

回答

1

正式沒有。子命令參數是必需的位置參數,其中「選擇」是子分析器名稱(及其別名)。

這在幫助信息中很明顯,是{cmd1,cmd}顯示爲選項。

usage: ipython3 [-h] {cmd1,cmd2} ... 

positional arguments: 
    {cmd1,cmd2} 

optional arguments: 
    -h, --help show this help message and exit 

最新的Python有一個'錯誤',實際上它是可選的。換句話說,如果你不給出任何定位,它不會引發錯誤。這是一個錯誤,因爲它改變了以前的行爲,並且大多數人需要它。但即使它是可選的,並且cmd1被定義爲默認值,它也不會在其餘參數上運行cmd1解析器。任何'位置'參數都將被視爲錯誤的命令字符串。

我認爲你可以做的最好的是定義一個或多個定位。人們可能有選擇和默認,並且是可選的(nargs ='?')。其餘(或其他)可能有nargs='+'。通過玩弄這些選項,您可以近似理想的行爲,但不會使用子分析器機制。


另一種方式去思考問題,是考慮像

prog one two 

輸入它應該解釋,由於prog src destprog cmd id。說它應該是前者的唯一依據是one不是copyresume之一。但是,在處理「選擇」時並不那麼聰明。它根據位置分配一個值,然後測試它是否符合「選擇」或「類型」等標準(即。integer,float v string)。

+0

雖然這不是我所希望的,但我認爲它是一樣的好。感謝您花時間解釋。 – Oliver 2015-03-09 18:51:25