一、有時候使用設計模式,例如工廠方法模式,函數傳的參數還須要一一根據條件傳遞到各個類裏面去實例化或者其餘緣由,直接複製全部的參數看起來不太好,形成不少相同的行。設計模式
二、直接函數/方法中寫**kwargs,那就不須要轉化了,但寫代碼要抵制這樣的寫法,這樣形成補全困難和使調用者不知道須要傳遞什麼參數,必須去深刻跳轉到代碼中去才知道須要傳遞什麼東西。最明顯的是,requests庫的get post函數了,用了*args,**kwargs形成不少小夥伴不知道到底要傳些什麼參數到函數中,或者知道要傳遞什麼參數,但常常把函數關鍵字參數拼寫錯誤,好比吧verify拼寫成了ferify,headers寫成了header,這樣寫後代碼會出錯。函數
三、例子post
def f(a=1,b=2,c=3):spa
f2(a,b,c)設計
f3(a,b,c)get
f4(a,b,c)pycharm
這樣寫代碼很重複,越長越愛出錯。requests
正確作法是 key_word_args = locals()io
而後f1(**key_word_args)request
f2(**key_word_args)
f3(**key_word_args)
上面說的是函數的例子,若是是方法,那就有一些區別。須要把第一個參數self彈出來
key_word_args = copy.deepcopy(locals())
key_word_args.pop('self')
而後self.f1(**key_word_args)
self.f2( **key_word_args)
四、若是直接寫
def f(**kwargs):
f2(**kwargs)
f3(**kwargs)
f4(**kwargs)
這樣寫雖然不須要轉化,但做爲公有方法,竟然不讓用戶知道須要傳遞什麼東西,使得pycharm沒法補全,這是下下策。個人就是包裝了requests的Session,添加了不少方法,使得用起來更簡單,並且永遠不會出參數名字現拼寫錯誤的狀況。
五、關鍵就是要用個locals()獲得一個字典,而且這個locals()須要放在函數的第一行,不然日後locals會變多,傳遞到裏面的東西時候,傳多了會報錯。