评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》
這篇文章的原文鏈接如下:
https://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes
我自己的話,堅持使用python2.x,因為已經對編碼比較熟悉了,這篇文章舉了兩個例子,我先來重現下,首先是
第一個問題,也就是該作者提到的編碼問題:
他的原文代碼是這樣的:
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('??'))評論下,首先他的上半部分代碼是無法運行的,只有下半部分代碼可以運行,并且他的下半部分代碼中的key_in_dict在文章的后半部分才定義,而且他給出的字典中也并沒有'??'。我直接運行了如下代碼: #-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') print('??')
我是linux下工作的,這個輸出并沒什么問題。
------------------------------------------------------第一部分解讀結束----------------------------------------------------------------------------------------------
第二個問題,也就是該作者提到的dictionary行為異常問題:
他的原文代碼是這樣的:
#-*- 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'你好'))運行結果是: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------
可以看到,解釋器都已經提醒了無法做==運算
先說下這個代碼寫法有什么問題,dict里面都已經指名了是str類型,查找的時候卻試圖使用unicode類型,這個本身就是寫法錯誤,不能把鍋甩到python的設計機制上面。
二、
#-*- 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'你好'))運行結果:True
True
False
True
[Finished in 0.0s]
和前面一樣,首先最后兩句print是不應該這么寫的,因為作者給的dicts里面存儲的本身就是str類型(這里并不是在批判作者,而是有些初學者確實可能這么來寫),不應該去一個不存在unicode類型key-value數值對里面的字典里去尋找unicode類型的key
就好比說,你去游樂園的時候,你會去鬼屋里面買東西嗎?鬼屋里是嚇人的場景,根本沒有吃的喝的,你是不是非要去鬼屋里買東西呢?
同樣的,該作者的寫作意圖是,有些dicts里根本沒有unicode類型,但是一些初學者試圖去查找unicode類型的key,所以,再次強調一遍,這不是python的問題,是初學者概念不清的問題。
當然,這篇文章作者的原意是好的,是希望大家別搞亂編碼了,尤其是對于初學者,
同樣地,我也給出我自己的結論:
只要熟悉編碼,可以繼續放心使用?setdefaultencoding('utf-8'),
另外:用python2.x寫代碼時,只要保證全局統一是str類型或者unicode類型就行了,并不會出問題,出問題的其實都是因為自己對編碼不清楚、不熟悉導致的。需要注意,有些python包只處理/返回unicode類型,這個時候要根據自己的全局類型設定進行轉化。
例如,我整個代碼都是str的,但是調用python包得到的結果是unicode的,那么將該結果轉化為str即可。
所以,該篇文章《立即停止使用 setdefaultencoding('utf-8'), 以及為什么》的真實意圖其實是,初學者都分不清str和unicode是什么區別的時候,把他們混淆在一起認為是一個東西的初學者,最好還是不要使用setdefaultencoding('utf-8'),會把概念搞得越來越亂。
而對于已經分清楚str和unicode的python使用者,其實對編碼已經很清晰了,也根本不會寫出上面的print語句,放心地使用setdefaultencoding('utf-8')即可。
請看懂上面游樂園鬼屋的例子
總結
以上是生活随笔為你收集整理的评论python编码文章《立即停止使用 setdefaultencoding('utf-8'), 以及为什么》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ab和jmeter进行GET/POST压
- 下一篇: websocket python爬虫_p