我可以关闭隐式Python Unicode转换来查找混合字符串的bug吗?

6 投票
1 回答
2066 浏览
提问于 2025-04-15 22:48

在分析我们的代码时,我惊讶地发现有数百万次调用
C:\Python26\lib\encodings\utf_8.py:15(decode)

我开始调试,发现我们的代码中有很多小问题,通常是把字符串和unicode进行比较,或者把字符串和unicode相加。Python很贴心地会自动把这些字符串解码,然后用unicode来进行后续操作。

这真是太好了,但代价也不小!

我对unicode非常熟悉,读过Joel SpolskyDive Into Python...

我尽量让我们的代码内部只使用unicode。

我的问题是——我能否关闭这种Python的“好心”行为?至少在我找到所有这些bug并修复它们之前(通常是通过加上u'u')?

有些bug非常难找(比如一个变量有时是字符串...)。

我使用的是Python 2.6.5(而且我不能切换到3.x)。

1 个回答

9

下面的代码应该可以正常工作:

>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('undefined')
>>> u"abc" + u"xyz"
u'abcxyz'
>>> u"abc" + "xyz"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/undefined.py", line 22, in decode
    raise UnicodeError("undefined encoding")
UnicodeError: undefined encoding

上面代码中的reload(sys)这一行在这里是必须的,因为通常情况下,sys.setdefaultencoding应该放在你Python的site-packages目录下的sitecustomize.py文件里(这样做是比较推荐的)。

撰写回答