2016-12-06 83 views
5

讓我們下面的例子:如何將字節作爲關鍵字參數的關鍵字傳遞給函數?

def fun(**args): 
    print(str(args)) 

dic = {'name': 'Pulkit'} 
fun(**dic) 

此代碼工作正常,我有以下的輸出:

{'name': 'Pulkit'} 

現在,讓我們傳遞的價值爲字節:

dic_vb = {'name': b'Pulkit'} 
fun(**dic_vb) 

這也可以正常工作,並具有以下輸出:

{'name': b'Pulkit'} 

但事情的變化,當我嘗試有鑰匙的字節:在類型錯誤說

dic_kb = {b'name': 'Pulkit'} 

這導致:

TypeError: fun() keywords must be strings 

有什麼辦法,我們可以通過字節作爲關鍵字參數。我還檢查了CPython代碼repo,它處理關鍵字參數,看起來像我們不能通過。有沒有什麼解決辦法,或者我需要確保unicodes通過。

我正在處理一個代碼庫,我們在Python 2上有很多這樣的實例,需要移植到Python 3.所以唯一可能的方法是將所有關鍵字參數轉換爲unicodes?

回答

4

沒有,關鍵字必須是有效標識符,這是一樣的道理,爲什麼你不能提供具有數字字典爲鍵的功能期待**kwargs:你看到了什麼

>>> dic = {1: 'Pulkit'} 
>>> fun(**dic) 
TypeErrorTraceback (most recent call last) 
<ipython-input-54-83c29ed0f08e> in <module>() 
     3 
     4 dic = {1: 'Pulkit'} 
----> 5 fun(**dic) 

TypeError: fun() keywords must be strings 

這也是來源,作爲執行者的否定(!PyUnicode_Check

它是必需的;您需要提供能夠充當名稱的密鑰。要了解什麼是,什麼是不允許的,只是儘量在交互式解釋它分配給一個名字,看看有什麼犯錯:

>>> b'my_list' = [...] # err 
>>> 23 = [21, 22]  # err 

一個可行的(和唯一的,如果不允許decode)選項傳遞詞典作爲另一個參數,然後通過正常的字典查找來訪問這些值。

當然,如果調用該函數之前解碼字節字符串是一個可行的選擇,我建議你追求的是選項:

>>> dic = {b'name': 'Pulkit'} 
>>> fun(**{b.decode(): v for b, v in dic.items()}) 
相關問題