2017-08-04 47 views
2

我的腳本具有以下用法:argparse:從位置到可選在某些情況下改變參數

prog.py login password [--show] 

loginpassword是位置參數。但是,如果指定了另一個參數(-s--show),我想將它們轉換爲可選項。因此,使用將是:

prog.py --show [login] [password] 

這是我的代碼:

parser = argparse.ArgumentParser(...) 
parser.add_argument('login', help="User login") 
parser.add_argument('password', help="User password") 
parser.add_argument('-s', '--show', dest='show', action='store_true', 
        help="Show user login and password") 

例子:

prog.py login=mylogin password=mypassword 

該腳本可以節省myloginmypassword到指定的文件authorization.txt

但是,prog.py --show應該只能檢索無需loginpassword參數並打印當前用戶的登錄名和密碼從authorization.txt信息到stdout:

login: mylogin 
password: mypassword 
+0

爲您的用例提供示例可幫助我們更好地理解您的問題。 –

+0

在你的代碼中'-s'和'--show'做同樣的事情,把'args.dest'屬性設置爲'True'。這兩個都不改變所需的兩個位置的解析。 – hpaulj

+0

處理這個問題的最簡單方法是使參數始終爲可選,然後檢查'show'參數值是否設置爲false,如果是,檢查是否提供了用於登錄名和密碼的vlaue並且適當地拋出錯誤? –

回答

3

我有限的與argparse經驗,因此需要少許鹽,但在這裏不用...

陣地參數是總是需要。如果您的腳本沒有明確要求它們完成所需的任何操作,那麼根據定義,它們實際上是可選的。

此外,argparse無法在突發奇想中處理對參數結構的更改。在調用parser.parse_args()之前,它應該如何知道傳遞給它的參數?

考慮到這一點,我認爲add_mutually_exclusive_group()是你可能需要什麼https://docs.python.org/2/library/argparse.html#mutual-exclusion

的想法是兩個創建用兩個可選參數,只有其中一個可以在任一週時間被稱爲:

prog.py --store [login password] --show 

這兩者都是可選的(但我知道)。如果將required標誌設置爲True,則在運行prog.py時,argparse將始終要求提供其中一個參數。所以我們真的得到是某種準可選位置的論點。

N.B.你不能將描述/幫助信息添加到一個互斥的羣體......痛苦的一點。

argparse代碼:

parser = argparse.ArgumentParser() 
exclusive_group = parser.add_mutually_exclusive_group(required=True) 
exclusive_group.add_argument('--store', dest='store', nargs=2, type=str, 
           help="Store user login and password") 
exclusive_group.add_argument('--show', dest='show', action='store_true', 
           help="Show user login and password") 
args = parser.parse_args() 
print(args) 

運行argparse代碼:

$:python test.py --show 
Namespace(show=True, store=None) 

$:python test.py --store foo bar 
Namespace(show=False, store=['foo', 'bar']) 

編輯: 我最初發布是nargs不會允許一個整數值來定義允許的變量數量,但要感謝@hpaulj進行更正。

您可以使用nargs=2,這意味着--store必須給予2個參數,並提供一個錯誤,如果它沒有得到2.因此,目標store是長度2.本名單否定任何需要進行驗證任何額外的代碼的變量數量,但是,這並不能防止變量的排序。由於它們存儲在列表中,因此可以按任意順序輸入......所以要小心。

+2

你可以使用'nargs = 2'。 – hpaulj

+1

@hpaulj啊!我一直試圖以'nargs ='2''的方式來做......這樣做更有意義。編輯答案。 – dijksterhuis

相關問題