2016-08-25 2 views
1

나는 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로 제한되지 않습니다.

+2

그래, 3.2에는 그 구문이 없습니다. '2to3'을 사용하지 않고 동일한 코드베이스로 파이썬 2와 파이썬 3.2를 지원해야합니까? – user2357112

+0

@ArekBulski : 2to3은 'six'을 사용하지 말아야합니다. 나는 2to3에서 코드가 'six'에 대해 알고 있다고 생각하지 않는다. 'u' 리터럴을 사용하여 코드에서 2to3을 실행하면 'u'가 제거됩니다. – user2357112

답변

1

나는 여기에서 운이 없다고 생각합니다.

six.u() 또는 파이썬 3.2의 드롭 지원을 사용하십시오.

+0

소스는 다음 위치에 있습니다. https://github.com/spotify/luigi/blob/b5b578da87f8ed18bb2b8c077f2d24cc5d912c7c/luigi/six.py#L646-L647 기본적으로 파이썬 3 문자열이 통과되어 파이썬 2에서 유니 코드로 변환됩니다. –

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"으로 변경하면 모든 버전에서 문자열 리터럴이 유니 코드가됩니다. 이 경우 리터럴 b에 영향을주지 않습니다.

+0

이 솔루션은 트래비스에서 실패합니다. – ArekBulski

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") 
관련 문제