2010-08-02 2 views
0

Попытка выполнить чей-то код, получив синтаксическую ошибку. Понятия не имею, почему :(Python if statement "SyntaxError: invalid syntax"

def GetParsers(self, systags): 
    childparsers = reduce(lambda a,b : a+b, [[]] + [ plugin.GetParsers(systags) for plugin in self.plugins ]) 
    parsers = [ p for plist in [ self.parsers[t] for t in systags if self.parsers.has_key(t) ] for p in plist ] 
    return reduce(lambda a,b : (a+[b] if not b in a else a), [[]] + parsers + childparsers) 

И ошибка

File "base.py", line 100 
    return reduce(lambda a,b : (a+[b] if not b in a else a), [[]] + parsers + childparsers) 

Python версии

Python 2.2.3 (#1, May 1 2006, 12:33:49) 
[GCC 3.2.3 20030502 (Red Hat Linux 3.2.3-54)] on linux2 

             ^           
+0

Можете ли вы опубликовать всю версию stacktrace и python? Здесь он правильно разбирается. – relet

+0

Не дает синтаксической ошибки. Какую версию python вы используете? Какую версию python они запускают? –

+0

Работает отлично для меня в обоих версиях 3.1 и 2.6 – delnan

ответ

5

Условные выражения были добавлены в 2,5 (source) - у вас 2.2, так что никаких условных выражений для вас. , Боюсь, они просто не существуют в этой версии. Окончательно обновляйте (не только для этого небольшого изменения, есть буквально тысячи из них с '06), если можете.

1

Переход на новую версию Python будет лучшим решением, но если по какой-либо причине вы не можете обновить, вы можете обновить код для использования the and-or trick.

Так что:

>>> 'a' if 1 == 2 else 'b' 
'b' 

становится:

>>> (1 == 2) and 'a' or 'b' 
'b' 

Существует небольшая проблема здесь в том, что если значение вы возврат для самого Тру оценивает на Ложное это заявление не будет работать как пожелаете. Вы можете обойти эту проблему следующим образом:

>>> ((1 == 2) and ['a'] or ['b'])[0] 
'b' 

В этом случае, поскольку значение не является пустым списком он никогда не будет вычисляться значение False, так что трюк будет всегда работать.