Whi*_*ger 3 python syntax function-declaration
我正在尝试在python 3.4中使用我的代码中的theano.但是,有许多功能具有以下奇怪的语法
def c_code(self, node, name, (var1, var2), (var3,), sub):
...
Run Code Online (Sandbox Code Playgroud)
即它们在函数定义中有括号.
Python会对它们抛出语法错误
文件".../Theano-0.7.0/theano/scalar/basic.py",第1011行
def c_code(self,node,name,(var1,var2),(var3,),sub):
^ SyntaxError:invalid句法
现在,一旦我删除那些额外的括号,一切都很好,但我是python的新手,并注意到python 3中有很多变化,所以这些括号可能需要用其他东西替换而不是删除.
有人可以向我解释(a)函数定义中包含括号的含义是什么?(b)这些是否以及如何与python 3一起使用?
通过PEP3113在Python 3.0中删除了元组参数解包:
元组参数解包是使用元组作为函数签名中的参数,以便自动解压缩序列参数.一个例子是:
Run Code Online (Sandbox Code Playgroud)def fxn(a, (b, c), d): pass
(b, c)签名中的使用要求函数的第二个参数是长度为2的序列(例如,[42, -13]).当传递这样的序列时,它被解压缩并将其值分配给参数,就像语句b, c = [42, -13]已在参数中执行一样.不幸的是,Python丰富的功能签名功能的这一特性虽然在某些情况下很方便,但却导致了比它们更值得的问题.因此,这个PEP建议从Python 3.0中删除它们.
所以如果你采取这个功能签名
def fun(foo, (a, b, c), bar):
pass
Run Code Online (Sandbox Code Playgroud)
那相当于
def fun(foo, arg, bar):
a, b, c = arg
pass
Run Code Online (Sandbox Code Playgroud)
所以这就是你用Python 3.x实现相同行为的方式.
但是,由于这不是您自己的代码库,我没有看到解决这个问题的简单方法(缺少猴子修补),并且可能还有更多的Python 3不兼容性不像SyntaxErrors 那样容易被发现.
有趣的是,由@tobias_k链接的问题#783已经关闭,从中可以看出Python 3支持已经解决并完成了.此外,Theano 确实 根据它的Trove分类器声称支持Python 3.
但是,您使用的版本(0.7.0)是最近发布的版本,您遇到的函数签名实际上仍然可以在当前版本中找到master.所以 - 这是一个错误,您应该在Theano的GitHub问题跟踪器上提出问题.