2015-05-01 3 views
0

У меня проблема с Travis на каждом коммите. Мои тесты работают на местном, но на Трэвиса я получаю эту ошибку:Недопустимый синтаксис при запуске теста на Travis

Traceback (most recent call last): 
    File "/opt/python/3.2.5/lib/python3.2/unittest/case.py", line 370, in _executeTestPart 
    function() 
    File "/opt/python/3.2.5/lib/python3.2/unittest/loader.py", line 32, in testFailure 
    raise exception 
ImportError: Failed to import test module: test.test_parser 
Traceback (most recent call last): 
    File "/opt/python/3.2.5/lib/python3.2/unittest/loader.py", line 261, in _find_tests 
    module = self._get_module_from_name(name) 
    File "/opt/python/3.2.5/lib/python3.2/unittest/loader.py", line 239, in _get_module_from_name 
    __import__(name) 
    File "/home/travis/build/davidmogar/genderator/test/test_parser.py", line 5, in <module> 
    import genderator 
    File "/home/travis/build/davidmogar/genderator/genderator/__init__.py", line 3, in <module> 
    from genderator.parser import Parser 
    File "/home/travis/build/davidmogar/genderator/genderator/parser.py", line 5, in <module> 
    from .utils import Normalizer 
    File "/home/travis/build/davidmogar/genderator/genderator/utils.py", line 63 
    u'\N{COMBINING TILDE}' 
         ^
SyntaxError: invalid syntax 

Вот код, где эта линия:

def remove_accent_marks(text): 
     good_accents = { 
      u'\N{COMBINING TILDE}', 
      u'\N{COMBINING CEDILLA}' 
     } 

     return ''.join(c for c in unicodedata.normalize('NFKD', text) 
         if unicodedata.category(c) != 'Mn' or c in good_accents) 

Я понятия не имею о том, что это проблема, потому что, как я сказал, что все тесты работают на местном уровне. Вот мой .travis.yml файл:

language: python 
python: 
    - "3.2" 
    - "3.3" 
    - "3.4" 
script: python -m unittest discover 

Любая идея?

ответ

3

Синтаксис u'...' в Python 3 поддерживается только в Python 3.3 and up.

u Приставка только там, чтобы поддержать код полиглот Python (поддерживает как 2 и 3), и может быть безопасно удалены, если вам не нужно поддерживать Python 2.

Если вам нужно поддерживать как Python 2 и 3.2, вам придется использовать другой подход. Вы можете использовать импорт from __future__, чтобы все строковые литералы в Python 2 производили unicode строковые объекты; это относится на модуль:

from __future__ import unicode_literals 

def remove_accent_marks(text): 
    good_accents = { 
     '\N{COMBINING TILDE}', 
     '\N{COMBINING CEDILLA}' 
    } 

Струны будут рассматриваться как Unicode в обоих Python 2 и 3.

Или вы можете создать свою собственную функцию полиглота:

import sys 

if sys.version_info[0] < 3: 
    u = lambda s: unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") 
else: 
    u = lambda s: s 

и использовать что все ваши строки Unicode:

def remove_accent_marks(text): 
    good_accents = { 
     u('\N{COMBINING TILDE}'), 
     u('\N{COMBINING CEDILLA}') 
    } 

или вы можете использовать six library производить что бр idge для вас:

import six 

def remove_accent_marks(text): 
    good_accents = { 
     six.u('\N{COMBINING TILDE}'), 
     six.u('\N{COMBINING CEDILLA}') 
    } 

Вы можете прочитать Python Porting HOWTO.

+0

Я хотел бы поддержать Python 2. Есть ли альтернатива? –

+0

@ DavidMorenoGarcía: обновлен с вашими альтернативами. –

+0

Спасибо. Отличный ответ. –

Смежные вопросы