2016-08-25 77 views
1

我有一系列在特拉維斯CI上運行的單元測試,在PY3.2上只有只有,它會肚子痛。我怎樣才能解決這個問題,而不使用six.u()?在Python 3.2上缺少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。

+2

是的,3.2只是沒有這種語法。你是否需要使用相同的代碼庫來支持Python 2和Python 3.2,而不使用'2to3'? – user2357112

+0

@ArekBulski:2to3永遠不應該讓你使用'six'。我不認爲2to3中的任何代碼都知道「six」。當我使用'u'文字對代碼運行2to3時,它會剝掉'u'。 – user2357112

回答

1

我覺得你在這裏運氣不好。

要麼使用six.u()要麼刪除對Python 3.2的支持。

+0

來源位於:https://github.com/spotify/luigi/blob/b5b578da87f8ed18bb2b8c077f2d24cc5d912c7c/luigi/six.py#L646-L647 本質上,它讓Python 3的字符串通過並轉換爲Python 2上的unicode。 –

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文字。

+0

此解決方案在Travis上失敗。 – 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")