1. 程式人生 > >python 將函式引數一鍵轉化成字典的技巧,非**kwargs,抵制kwargs。

python 將函式引數一鍵轉化成字典的技巧,非**kwargs,抵制kwargs。

1、有時候使用設計模式,例如工廠方法模式,函式傳的引數還需要一一根據條件傳遞到各個類裡面去例項化或者其他原因,直接複製所有的引數看起來不太好,造成很多相同的行。

 

2、直接函式/方法中寫**kwargs,那就不需要轉化了,但寫程式碼要抵制這樣的寫法,這樣造成補全困難和使呼叫者不知道需要傳遞什麼引數,必須去深入跳轉到程式碼中去才知道需要傳遞什麼東西。最明顯的是,requests庫的get post函數了,用了*args,**kwargs造成很多小夥伴不知道到底要傳些什麼引數到函式中,或者知道要傳遞什麼引數,但經常把函式關鍵字引數拼寫錯誤,比如吧verify拼寫成了ferify,headers寫成了header,這樣寫後代碼會出錯。

 

3、例子

def f(a=1,b=2,c=3):

      f2(a,b,c)

   f3(a,b,c)

     f4(a,b,c)

 

這樣寫程式碼很重複,越長越愛出錯。

正確做法是 key_word_args = locals()

然後f1(**key_word_args)

f2(**key_word_args)

f3(**key_word_args)

 

上面說的是函式的例子,如果是方法,那就有一些區別。需要把第一個引數self彈出來

 key_word_args = locals()

 key_word_args.pop('self')

 

然後self.f1(**key_word_args)

self.f2( **key_word_args)

 

4、如果直接寫

def f(**kwargs):

      f2(**kwargs)

   f3(**kwargs)

     f4(**kwargs)

 

這樣寫雖然不需要轉化,但作為公有方法,居然不讓使用者知道需要傳遞什麼東西,使得pycharm無法補全,這是下下策。我的就是包裝了requests的Session,添加了很多方法,使得用起來更簡單,而且永遠不會出引數名字現拼寫錯誤的情況。

 

5、關鍵就是要用個locals()得到一個字典,並且這個locals()需要放在函式的第一行,否則往後locals會變多,傳遞到裡面的東西時候,傳多了會報錯。