python 字典 get 方法的避坑

文章解释了在使用chardet库的detect方法获取bytes字符串编码时,如何正确处理返回的None值。get方法的用法被详细阐述,强调了当key存在但值为None时,get仍会返回None。解决方案是先检查encoding是否存在,然后才使用get方法,确保在encoding为None时返回utf8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

我要使用 chardet 库的 detect 方法判断某个 bytes 字符串的编码,获取它的编码后,使 str() 能够用正确的编码将 bytes 转为 str。如下

import chardet

def get_encoding(string: bytes) -> str:
    return chardet.detect(string).get('encoding', 'utf8')

正常情况下,chardet.detect(string) 的结果如下:

{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}

但当结果 encodingNone 的时候,get_encoding 函数返回的其实不是所期望的 utf8,仍然是 None,如下:

{'encoding': None, 'confidence': 0.73, 'language': ''}

为什么呢?我不是用了get方法:.get('encoding', 'utf8') 吗,它的意思不是在 encodingNone 的情况下返回 utf8 吗?

其实不是的。让我们看一下 get 函数官方文档解释:

get(key[, default])
如果 key 存在于字典中则返回 key 的值,否则返回 default。 如果 default 未给出则默认为 None,因而此方法绝不会引发 KeyError。

详细解释一下就是:

  • 如果 key 不存在于字典中,那么返回 default 的值,default 的默认值是None

重点:不存在!

这下清楚了原因所在,我的错误在于,我将 default 理解成了:当 key
valueNone 时的返回值。

虽然 key 不存在时它的 value 也是 None,但和存在时是 None的区别就体现出来了。
get 函数说了:如果 key 不存在 于字典中,那 key 存在的话就直接返回 key 的值啊!回到上文,encoding 存在,且值 = None,那就返回None。

所以最终代码改造如下:

def get_encoding(string: bytes) -> str:
    if info := chardet.detect(string):
        if ret := info.get('encoding'):
            return ret
    return 'utf8'

总结

  • get(key[, default]) 函数的真正含义:
    如果 key 存在于字典中,则返回 key 的值,否则返回 default。 如果 default 未给出则默认为 None,因而此方法绝不会引发 KeyError。
  • 它用来和 d[key] 获取value的方式互补,两个方法的重点在于:key 是否存在于字典中
  • 还有一个setdefault(key[, default]) 函数也可以获取字典的值,只不过当 key 不存在时,会将 key 添加到字典中,并且将它的 value 设置为 default,default 的默认值为 None。

参考

映射类型 — dict 的内置API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值