2013-03-04 28 views
19

我有一個類定義如下如何傳遞argparse參數來作爲kwargs函數?

class M(object): 
    def __init__(self, **kwargs): 
     ...do_something 

和我的argparse.parse_args()的結果,例如:

> args = parse_args() 
> print args 
Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever") 

我想通過在該命名空間中的值(除了message_type)來創建類M的一個實例。我曾嘗試

M(args) 

,但得到了一個錯誤

TypeError: __init__() takes exactly 1 argument (2 given) 

,我不明白。我怎樣才能

  1. 從列表中刪除值message_typeargs
  2. 通上的值,如果我會直接鍵入M(value=5, message='test', extra="blah", param="whatever")

回答

31

您需要的vars(args)而不是結果經過:該命名空間實例的

M(**vars(args)) 

vars() function返回名稱空間(其__dict__屬性)作爲一本字典。

Inside M.__init__(),簡單地忽略message_type鍵。

+1

那正是我需要的。謝謝。除了刪除某個鍵。我需要刪除它,因爲這個問題的範圍之外的原因,我不能忽略它。 – Alex 2013-03-04 16:22:03

+2

我建議在vars(args).items(),如果k!=「message_type」)''做'arg_dict = dict((k,v),避免可能的未定義行爲與'vars'。 – Alex 2013-03-04 16:28:31

+0

@Alex:'vars'有什麼未定義的行爲?你可以用這種方式過濾掉'message_type'鍵,但是爲了它自己的緣故,不是因爲'vars()'可能有未定義的行爲(它沒有)。 – 2013-03-04 16:30:17