I'm trying to use theano in my code right now in python 3.4. However, there are many function with the following strange syntax
def c_code(self, node, name, (var1, var2), (var3,), sub):
...
i.e. they have brackets within the function definition.
Python throws a syntax error on them
File ".../Theano-0.7.0/theano/scalar/basic.py", line 1011
def c_code(self, node, name, (var1, var2), (var3, ), sub):
^ SyntaxError: invalid syntax
Now, once I remove those extra brackets, everything works great, but I'm new to python and noticed there were a lot of changes in python 3 so these brackets may need to be replaced with something else rather than removed.
Can someone explain to me (a) what having brackets inside function definition means? and (b) if and how can these be made to work with python 3?
Tuple argument unpacking has been removed in Python 3.0 via PEP3113:
Tuple parameter unpacking is the use of a tuple as a parameter in a function signature so as to have a sequence argument automatically unpacked. An example is:
def fxn(a, (b, c), d): pass
The use of
(b, c)
in the signature requires that the second argument to the function be a sequence of length two (e.g.,[42, -13]
). When such a sequence is passed it is unpacked and has its values assigned to the parameters, just as if the statementb, c = [42, -13]
had been executed in the parameter.Unfortunately this feature of Python's rich function signature abilities, while handy in some situations, causes more issues than they are worth. Thus this PEP proposes their removal from the language in Python 3.0.
So if you take this function signature
def fun(foo, (a, b, c), bar):
pass
then that is equivalent to
def fun(foo, arg, bar):
a, b, c = arg
pass
so that's the way you would achieve the same behavior with Python 3.x.
However, since this is not your own code base, I don't see an easy way of addressing that (short of monkey patching), and there might also be more Python 3 incompatibilities that aren't as easily spotted as SyntaxError
s.
Interestingly enough, issue #783 linked by @tobias_k has been closed, and from it it seems that Python 3 support has been addressed and finished. Also, Theano does claim Python 3 support according to it's Trove classifiers.
However, the version you're using (0.7.0) is the most recently released one, and the function signature you encountered is in fact still to be found on current master
. So - this is a bug, you should probably file an issue on Theano's GitHub issue tracker.