关于python:与theano的语法错误

Strange syntax error with theano

我正在尝试在python 3.4中使用我的代码中的theano。 但是,有许多函数具有以下奇怪的语法

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

即它们在函数定义中有括号。

Python会对它们抛出语法错误

File".../Theano-0.7.0/theano/scalar/basic.py", line 1011
def c_code(self, node, name, (var1, var2), (var3, ), sub):
^
SyntaxError: invalid syntax

现在,一旦我删除那些额外的括号,一切都很好,但我是python的新手,并注意到python 3中有很多变化,所以这些括号可能需要用其他东西替换而不是删除。

有人可以向我解释(a)函数定义中包含括号的含义是什么? (b)这些是否以及如何与python 3一起使用?


通过PEP3113在Python 3.0中删除了元组参数解包:

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:

1
2
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 statement b, 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.

所以如果你采取这个功能签名

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

那相当于

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

所以这就是你用Python 3.x实现相同行为的方式。

但是,由于这不是您自己的代码库,我没有看到解决这个问题的简单方法(缺少猴子修补),并且可能还有更多的Python 3不兼容性不像SyntaxError s那样容易被发现。

有趣的是,由@tobias_k链接的问题#783已经关闭,从中可以看出Python 3支持已经解决并完成了。此外,Theano确实根据它的Trove分类器声称支持Python 3。

但是,您使用的版本(0.7.0)是最近发布的版本,您遇到的函数签名实际上仍然可以在当前master上找到。所以 - 这是一个错误,您应该在Theano的GitHub问题跟踪器上提出问题。