背景
我要使用 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': ''}
但当结果 encoding
为 None
的时候,get_encoding
函数返回的其实不是所期望的 utf8
,仍然是 None
,如下:
{'encoding': None, 'confidence': 0.73, 'language': ''}
为什么呢?我不是用了get方法:.get('encoding', 'utf8')
吗,它的意思不是在 encoding
为 None
的情况下返回 utf8
吗?
其实不是的。让我们看一下 get 函数官方文档解释:
get(key[, default])
如果 key 存在于字典中则返回 key 的值,否则返回 default。 如果 default 未给出则默认为 None,因而此方法绝不会引发 KeyError。
详细解释一下就是:
- 如果
key
不存在于字典中,那么返回default
的值,default
的默认值是None
。
重点:不存在!
这下清楚了原因所在,我的错误在于,我将 default
理解成了:当 key
的 value
为 None
时的返回值。
虽然 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。