2015-11-09 59 views
2

問題:給定一個包含一些參數的argparse解析器實例,是否有刪除/移除爲其定義的參數的方法?如何刪除命名空間中的參數

爲什麼:考慮以下爲例:

>>>import argparse 
>>>parser = argparse.ArgumentParser() 
>>>parser.add_argument('--imagePath', action = "store", default = 'toto') 
_StoreAction(option_strings=['--imagePath'], dest='imagePath', nargs=None, const=None, default='toto', type=None, choices=None, help=None, metavar=None) 
>>>args = parser.parse_args() 
>>>args 
Namespace(imagePath='toto') 
>>>parser.add_argument('--resultPath', action = "store", default = 'titi') 
_StoreAction(option_strings=['--resultPath'], dest='resultPath', nargs=None, const=None, default='titi', type=None, choices=None, help=None, metavar=None) 
>>>args = parser.parse_args() 
>>>args 
Namespace(imagePath='toto', resultPath='titi') 

如果我們將在後面的腳本,改變args.imagePath的價值?

我沒有找到更改值的方法,但是如果我可以刪除/刪除參數imagePath,可以用一個新的值再次定義imagePath!

+0

你爲什麼要'parse_args'然後改變參數定義? – user2357112

+0

爲什麼解析然後忽略輸入參數?你真的*想要*去除參數,或者只是替換它的值(如果前者,爲什麼不忽略它)? – jonrsharpe

+0

在一個大腳本中,有一些關聯的可能參數很多。我只是添加一個新的參數,但取決於它的價值,我需要動態地改變其他人的價值。 hpaulj給了正確的方法來做到這一點 – servoz

回答

5

只要做到:

args.imagePath = 'newvalue' 

argsargparse.Namespace對象。這是一個簡單的類,它只是增加了一種顯示方法 - 你看到的是print(args)。否則,所有正常的Python對象方法都可以工作。所以你可以根據需要獲取,設置,甚至添加屬性。

parser試圖保持對名稱空間對象的假設爲最小。它使用最通用的訪問方法 - hasattr,getattr,setattr

例如

dest = 'imagePath' 
value = 'newvalue' 
setattr(args, dest, value) 

您也可以刪除,例如,

del args.imagePath 
delattr(args, 'imagePath') 

我很想改變你的標題爲'如何從命名空間刪除一個參數'。我不認爲你的意思是從parser本身刪除參數(由add_argument創建的動作)。您的重點是解析創建的名稱空間。

+0

太棒了!非常感謝hpaulj,你完全明白我的問題和我需要解決的問題!非常明確的答案!事實上,好的標題是「你如何從命名空間中刪除一個參數」。再次感謝 ! – servoz