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")
我有一连串的单元测试,在 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")