我在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。
答案 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")