评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》
這篇文章的原文鏈接如下:
https://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes
我自己的話,堅(jiān)持使用python2.x,因?yàn)橐呀?jīng)對(duì)編碼比較熟悉了,這篇文章舉了兩個(gè)例子,我先來(lái)重現(xiàn)下,首先是
第一個(gè)問(wèn)題,也就是該作者提到的編碼問(wèn)題:
他的原文代碼是這樣的:
import chardet def print_string(string):try:print(u"%s" % string)except UnicodeError:print u"%s" % unicode(byte_string, encoding=chardet.detect(string)['encoding'])print_string(u"??".encode("latin-1"))import sys reload(sys) sys.setdefaultencoding('utf-8')print(key_in_dict('??'))評(píng)論下,首先他的上半部分代碼是無(wú)法運(yùn)行的,只有下半部分代碼可以運(yùn)行,并且他的下半部分代碼中的key_in_dict在文章的后半部分才定義,而且他給出的字典中也并沒(méi)有'??'。我直接運(yùn)行了如下代碼: #-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') print('??')
我是linux下工作的,這個(gè)輸出并沒(méi)什么問(wèn)題。
------------------------------------------------------第一部分解讀結(jié)束----------------------------------------------------------------------------------------------
第二個(gè)問(wèn)題,也就是該作者提到的dictionary行為異常問(wèn)題:
他的原文代碼是這樣的:
#-*- coding: utf-8 -*-d = {1:2, '1':'2', '你好': 'hello'} def key_in_dict(key)if key in d:return Truereturn Falsedef key_found_in_dict(key):for _key in d:if _key == key:return Truereturn False #-*- coding: utf-8 -*-print(key_in_dict('你好')) print(key_found_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))print('------utf-8------')import sys reload(sys) sys.setdefaultencoding('utf-8')print(key_in_dict('你好')) print(key_found_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))以上該作者的代碼可以分解為以下兩部分。一、
#-*- coding: utf-8 -*- d = {1:2, '1':'2', '你好': 'hello'} def key_in_dict(key):if key in d:return Truereturn Falsedef key_found_in_dict(key):for _key in d:if _key == key:return Truereturn False#-*- coding: utf-8 -*-print(key_in_dict('你好')) print(key_found_in_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))運(yùn)行結(jié)果是:True
True
False
/home/appleyuchi/桌面/pythonprojects/jianshu/d09778f4e055/encode.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
? if _key == key:
False
------utf-8------
可以看到,解釋器都已經(jīng)提醒了無(wú)法做==運(yùn)算
先說(shuō)下這個(gè)代碼寫(xiě)法有什么問(wèn)題,dict里面都已經(jīng)指名了是str類(lèi)型,查找的時(shí)候卻試圖使用unicode類(lèi)型,這個(gè)本身就是寫(xiě)法錯(cuò)誤,不能把鍋甩到python的設(shè)計(jì)機(jī)制上面。
二、
#-*- coding: utf-8 -*-d = {1:2, '1':'2', '你好': 'hello'} def key_in_dict(key):if key in d:return Truereturn Falsedef key_found_in_dict(key):for _key in d:if _key == key:return Truereturn False import sys reload(sys) sys.setdefaultencoding('utf-8') print(key_in_dict('你好')) print(key_found_in_dict('你好')) print(key_in_dict(u'你好')) print(key_found_in_dict(u'你好'))運(yùn)行結(jié)果:True
True
False
True
[Finished in 0.0s]
和前面一樣,首先最后兩句print是不應(yīng)該這么寫(xiě)的,因?yàn)樽髡呓o的dicts里面存儲(chǔ)的本身就是str類(lèi)型(這里并不是在批判作者,而是有些初學(xué)者確實(shí)可能這么來(lái)寫(xiě)),不應(yīng)該去一個(gè)不存在unicode類(lèi)型key-value數(shù)值對(duì)里面的字典里去尋找unicode類(lèi)型的key
就好比說(shuō),你去游樂(lè)園的時(shí)候,你會(huì)去鬼屋里面買(mǎi)東西嗎?鬼屋里是嚇人的場(chǎng)景,根本沒(méi)有吃的喝的,你是不是非要去鬼屋里買(mǎi)東西呢?
同樣的,該作者的寫(xiě)作意圖是,有些dicts里根本沒(méi)有unicode類(lèi)型,但是一些初學(xué)者試圖去查找unicode類(lèi)型的key,所以,再次強(qiáng)調(diào)一遍,這不是python的問(wèn)題,是初學(xué)者概念不清的問(wèn)題。
當(dāng)然,這篇文章作者的原意是好的,是希望大家別搞亂編碼了,尤其是對(duì)于初學(xué)者,
同樣地,我也給出我自己的結(jié)論:
只要熟悉編碼,可以繼續(xù)放心使用?setdefaultencoding('utf-8'),
另外:用python2.x寫(xiě)代碼時(shí),只要保證全局統(tǒng)一是str類(lèi)型或者unicode類(lèi)型就行了,并不會(huì)出問(wèn)題,出問(wèn)題的其實(shí)都是因?yàn)樽约簩?duì)編碼不清楚、不熟悉導(dǎo)致的。需要注意,有些python包只處理/返回unicode類(lèi)型,這個(gè)時(shí)候要根據(jù)自己的全局類(lèi)型設(shè)定進(jìn)行轉(zhuǎn)化。
例如,我整個(gè)代碼都是str的,但是調(diào)用python包得到的結(jié)果是unicode的,那么將該結(jié)果轉(zhuǎn)化為str即可。
所以,該篇文章《立即停止使用 setdefaultencoding('utf-8'), 以及為什么》的真實(shí)意圖其實(shí)是,初學(xué)者都分不清str和unicode是什么區(qū)別的時(shí)候,把他們混淆在一起認(rèn)為是一個(gè)東西的初學(xué)者,最好還是不要使用setdefaultencoding('utf-8'),會(huì)把概念搞得越來(lái)越亂。
而對(duì)于已經(jīng)分清楚str和unicode的python使用者,其實(shí)對(duì)編碼已經(jīng)很清晰了,也根本不會(huì)寫(xiě)出上面的print語(yǔ)句,放心地使用setdefaultencoding('utf-8')即可。
請(qǐng)看懂上面游樂(lè)園鬼屋的例子
總結(jié)
以上是生活随笔為你收集整理的评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ab和jmeter进行GET/POST压
- 下一篇: 递归删除文件夹下面所有子文件夹中的.py