Pul*_*yal 5 python function keyword-argument python-3.x
让我们举个例子:
def fun(**args):
print(str(args))
dic = {'name': 'Pulkit'}
fun(**dic)
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,我有以下输出:
{'name': 'Pulkit'}
Run Code Online (Sandbox Code Playgroud)
现在让我们将值作为字节传递:
dic_vb = {'name': b'Pulkit'}
fun(**dic_vb)
Run Code Online (Sandbox Code Playgroud)
这也很好,并具有以下输出:
{'name': b'Pulkit'}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将密钥作为字节时,事情会发生变化:
dic_kb = {b'name': 'Pulkit'}
Run Code Online (Sandbox Code Playgroud)
这导致TypeError说:
TypeError: fun() keywords must be strings
Run Code Online (Sandbox Code Playgroud)
有没有办法我们可以传递字节作为关键字参数.我还在repo检查了CPython代码,它处理关键字参数,似乎我们无法通过.是否有任何解决方法或我需要确保传递unicodes.
我正在处理一个代码库,我们在Python 2上有很多这样的实例,需要移植到Python 3.所以唯一可能的方法是将所有关键字参数转换为unicodes?
不,关键字必须是有效的标识符,这与您不能提供以数字作为函数期望的键的字典的原因相同**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
Run Code Online (Sandbox Code Playgroud)
这也是您在源代码中看到的内容,其中否定 ( !) 表示PyUnicode_Check充当执行者。
这是必需的;您需要提供能够充当名称的键。要查看什么是允许的,什么是不允许的,只需尝试在交互式解释器中将其分配给一个名称,然后看看会出现什么错误:
>>> b'my_list' = [...] # err
>>> 23 = [21, 22] # err
Run Code Online (Sandbox Code Playgroud)
一个可行的(也是唯一的,如果decode不允许的话)选项是将字典作为另一个参数传递,然后通过正常的字典查找来访问值。
当然,如果在调用函数之前将字节解码为字符串是一个可行的替代方案,我建议您采用该选项:
>>> dic = {b'name': 'Pulkit'}
>>> fun(**{b.decode(): v for b, v in dic.items()})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |