Странная синтаксическая ошибка с theano

Я пытаюсь использовать theano в своем коде прямо сейчас в python 3.4. Однако есть много функций со следующим странным синтаксисом

def c_code(self, node, name, (var1, var2), (var3,), sub):
...

то есть они имеют скобки в определении функции.

Python выдает на них синтаксическую ошибку

Файл ".../Theano-0.7.0/theano/scalar/basic.py", строка 1011
def c_code(self, node, name, (var1, var2), (var3, ), sub):< br> ^ SyntaxError: неверный синтаксис

Теперь, когда я удаляю эти дополнительные скобки, все работает отлично, но я новичок в python и заметил, что в python 3 было много изменений, поэтому эти скобки, возможно, придется заменить чем-то другим, а не удалять.

Может ли кто-нибудь объяснить мне (а), что означает наличие скобок внутри определения функции? и (б) можно ли и как заставить их работать с Python 3?


person WhiteTiger    schedule 01.05.2015    source источник
comment
Похоже, что это допустимый синтаксис в Python 2.x, но не в Python 3. Это означает, что третий параметр — это двухэлементный кортеж, который автоматически распаковывается как var1 и var2.   -  person tobias_k    schedule 01.05.2015
comment
Связано: github.com/Theano/Theano/issues/783   -  person tobias_k    schedule 01.05.2015


Ответы (1)


Распаковка аргументов кортежа была удалена в Python 3.0 через PEP3113:

Распаковка параметра кортежа – это использование кортежа в качестве параметра в сигнатуре функции для автоматической распаковки аргумента последовательности. Пример:

def fxn(a, (b, c), d):
    pass

Использование (b, c) в подписи требует, чтобы вторым аргументом функции была последовательность длины два (например, [42, -13] ). Когда передается такая последовательность, она распаковывается, и ее значения присваиваются параметрам, как если бы в параметре был выполнен оператор b, c = [42, -13].

К сожалению, эта особенность богатых возможностей подписи функций Python, хотя и удобна в некоторых ситуациях, вызывает больше проблем, чем они того стоят. Таким образом, этот PEP предлагает их удаление из языка в Python 3.0.

Итак, если вы возьмете эту сигнатуру функции

def fun(foo, (a, b, c), bar):
    pass

тогда это эквивалентно

def fun(foo, arg, bar):
    a, b, c = arg
    pass

таким образом вы добьетесь такого же поведения с Python 3.x.

Однако, поскольку это не ваша собственная кодовая база, я не вижу простого способа решить эту проблему (за исключением исправления обезьяны), и также может быть больше несовместимостей Python 3, которые не так легко обнаружить, как SyntaxErrors.


Интересно, что issue #783, на которую ссылается @tobias_k, закрыта, и из этого следует, что что поддержка Python 3 была решена и закончена. Кроме того, Theano делает требует поддержки Python 3 согласно классификаторам Trove.

Однако версия, которую вы используете (0.7.0), является самой последней выпущенной, и сигнатура функции, с которой вы столкнулись, на самом деле еще не найдено на текущем master. Итак, это ошибка, вам, вероятно, следует зарегистрировать проблему в системе отслеживания проблем Theano на GitHub.

person Lukas Graf    schedule 01.05.2015
comment
так что патчить fun(foo, (a,b,c), bar) до fun(foo,a,b,c,bar) не очень хорошая идея? - person WhiteTiger; 01.05.2015
comment
@WhiteTiger проблема в том, что это само по себе не сработает, потому что есть вероятность, что в Theano есть другой код, который использует эту функцию и ожидает сигнатуру старой функции. И я был неправ, даже обезьяна, исправляющая функцию и обертывающая ее, не сработает, потому что старая подпись все еще существует, и все еще является недопустимым синтаксисом в Python 3, поэтому она даже не будет компилироваться. - person Lukas Graf; 01.05.2015
comment
@WhiteTiger, если я просто просматриваю этот модуль на github есть тонна других функций, использующих распаковку кортежей. Таким образом, кажется, что они действительно приложили усилия для достижения совместимости с Python 3 только один раз, но не придерживались этого и вернулись к использованию старых шаблонов. - person Lukas Graf; 01.05.2015
comment
@WhiteTiger модуль 2to3, похоже, имеет фиксатор для распаковки параметров кортежа, который в основном применяет изменение, описанное выше. Так что вы можете попробовать снова перенести кодовую базу Theano на Python3, но, честно говоря, я не думаю, что ваши шансы велики. Если вы пропустили все эти синтаксические ошибки, это означает, что 1) у них нет тестов для Py3 и 2) ни один из разработчиков не использует Py3, поэтому вы, скорее всего, столкнетесь со многими другими несовместимостями. - person Lukas Graf; 02.05.2015