在Python 3.2上缺少u字符串?

时间:2016-08-25 00:01:29

标签: python unicode travis-ci nose six

我在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/

  

在Python 2上,u()不知道文字的编码是什么。   每个字节直接转换为相同的unicode代码点   值。因此,使用带有字符串的u()是唯一安全的   ASCII数据。

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

3 个答案:

答案 0 :(得分:1)

您可以改为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文字。

答案 1 :(得分:1)

我觉得你在这里运气不好。

使用six.u()或删除对Python 3.2的支持。

答案 2 :(得分:0)

我执行了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")