2016-12-06 84 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()}) 
相关问题