【问题标题】:Can I turn off implicit Python unicode conversions to find my mixed-strings bugs?我可以关闭隐式 Python unicode 转换来查找我的混合字符串错误吗?
【发布时间】:2011-02-20 13:02:41
【问题描述】:

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

我开始调试,发现在我们的代码库中存在许多小错误,通常是将字符串与 unicode 进行比较或添加字符串和 unicode。 Python 优雅地解码字符串并在 unicode 中执行以下操作。

真好。但是很贵!

我精通 unicode,读过 Joel SpolskyDive Into Python...

我尝试将我们的代码内部只保留在 unicode 中。

我的问题 - 我可以关闭这个 Pythonic 好人的行为吗?至少在我找到所有这些错误并修复它们之前(通常通过添加一个 u'u')?

其中一些很难找到(有时是字符串的变量...)。

Python 2.6.5(我无法切换到 3.x)。

【问题讨论】:

    标签: python debugging unicode decoding


    【解决方案1】:

    以下应该有效:

    >>> 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
    

    上面的 sn-p 中的reload(sys) 仅在这里是必需的,因为通常sys.setdefaultencoding 应该放在 Python site-packages 目录中的 sitecustomize.py 文件中(建议这样做)。

    【讨论】:

    • 哇哦。我喜欢它。你能再解释一下reload() 是如何发挥它的魔力的吗?它如何以及为什么会使sitecustomize.py 设置无效?
    • 在我的 Apple Python 2.6 版本中(但我在其他地方看到过......)site.py(在你的 std python lib 目录中;在 Python 启动时自动执行一次)包含(接近尾声) :if hasattr(sys, "setdefaultencoding"): del sys.setdefaultencoding。这使得该属性在 sys 上不可用,除非您明确选择 reload(sys)(或取消注释删除)。它曾经在早期的 Python iirc 中直接可用。
    • 非常酷 - 谢谢! Pydev 和 Pylint 讨厌你,但它有效! ...我在几分钟内发现了一大堆“错误”,其中一些在 Python 源代码中! (它们并不完全是错误,因为代码可以工作,在我修复它之后它会更好地工作)。 CSV 文件: split(u'\t') 需要小 'u'。字典键在 2.6 中并不完全是 unicode ... - 谁会有 thunk?!?!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2022-12-05
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多