Python 3.2 缺少 u 字符串?

Missing u-strings on Python 3.2?

我有一连串的单元测试,在 Travis CI 上是 运行 ,在 PY3.2 上 只有 它会崩溃。我如何在不使用 six.u() 的情况下解决这个问题?

def test_parse_utf8(self):
    s = String("foo", 12, encoding="utf8")
    self.assertEqual(s.parse(b"hello joh\xd4\x83n"), u"hello joh\u0503n")

======================================================================
ERROR: Failure: SyntaxError (invalid syntax (test_strings.py, line 37))
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/travis/virtualenv/python3.2.5/lib/python3.2/site-packages/nose/failure.py", line 39, in runTest
    raise self.exc_val.with_traceback(self.tb)
  File "/home/travis/virtualenv/python3.2.5/lib/python3.2/site-packages/nose/loader.py", line 414, in loadTestsFromName
    addr.filename, addr.module)
  File "/home/travis/virtualenv/python3.2.5/lib/python3.2/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/home/travis/virtualenv/python3.2.5/lib/python3.2/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/travis/build/construct/construct/tests/test_strings.py", line 37
    self.assertEqual(s.build(u"hello joh\u0503n"), b"hello joh\xd4\x83n")
                                               ^
SyntaxError: invalid syntax

正在努力让它发挥作用:

PY3 = sys.version_info[0] == 3
def u(s): return s if PY3 else s.decode("utf-8")

self.assertEqual(s.parse(b"hello joh\xd4\x83n"), u("hello joh\u0503n"))

引自https://pythonhosted.org/six/

On Python 2, u() doesn’t know what the encoding of the literal is. Each byte is converted directly to the unicode codepoint of the same value. Because of this, it’s only safe to use u() with strings of ASCII data.

但使用 unicode 的全部意义在于不限于 ASCII。

您能否改用 from __future__ import unicode_literals 而不是在任何地方使用 u 语法?

from __future__ import unicode_literals 使 Python 早期版本中没有前缀 u 的字符串文字与 Python 3 中一样,默认为 unicode。因此,如果您执行 from __future__ import unicode_literals 并将所有 u"strings" 更改为 "strings",您的字符串文字在所有版本中都将是 unicode。这不会影响 b 文字。

我觉得你运气不好。

使用 six.u() 或放弃对 Python 3.2 的支持。

我采用了 six.u() 的实现并丢弃了 six

import sys
PY3 = sys.version_info[0] == 3
def u(s): return s if PY3 else unicode(s.replace(r'\', r'\\'), "unicode_escape")