나는 Travis CI와 에서만 실행되는 단위 테스트를 많이하고 있는데, PY3.2에서 만 배꼽을 듭니다. six.u()를 사용하지 않고 어떻게 해결할 수 있습니까? Python 3.2에서 u-strings가 누락 되었습니까?
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/
에서 파이썬 2에서 u는() 모르는 어떤 인코딩 문자 그대로입니다. 각 바이트는 동일한 값의 유니 코드 코드 포인트로 직접 변환됩니다. 이 때문에 ASCII 데이터 의 문자열로 u()를 사용하는 것이 안전합니다.
그러나 유니 코드 사용의 전체적인 점은 ASCII로 제한되지 않습니다.
그래, 3.2에는 그 구문이 없습니다. '2to3'을 사용하지 않고 동일한 코드베이스로 파이썬 2와 파이썬 3.2를 지원해야합니까? – user2357112
@ArekBulski : 2to3은 'six'을 사용하지 말아야합니다. 나는 2to3에서 코드가 'six'에 대해 알고 있다고 생각하지 않는다. 'u' 리터럴을 사용하여 코드에서 2to3을 실행하면 'u'가 제거됩니다. – user2357112