我们如何将字节作为关键字参数的关键字传递给函数?

时间:2016-12-06 17:14:27

标签: python function python-3.x keyword-argument

让我们举个例子:

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

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

此代码工作正常,我有以下输出:

{'name': 'Pulkit'}

现在让我们将值传递为bytes:

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

这也很好,并有以下输出:

{'name': b'Pulkit'}

但是当我尝试将密钥作为字节时,事情会发生变化:

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

这导致TypeError说:

TypeError: fun() keywords must be strings

我们是否可以将字节作为关键字参数传递。我还检查了repo处理关键字参数的CPython代码,看起来我们无法通过。是否有任何解决方法或我需要确保传递unicodes。

我正在处理一个代码库,我们在Python 2上有很多这样的实例,需要移植到Python 3.所以只能将所有关键字参数转换为unicodes吗?

1 个答案:

答案 0 :(得分: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()})