2014-01-28 51 views
-5

我有这段代码,我读了一些关于将python 2转换为python 3的内容,但是我遇到了问题。将lambda函数转换为python 3

lambda(k, val): (k, 
            re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);", 
              self._convertEntities, 
              val)) 
+2

到底是什么问题? –

+0

这是Python 2中的代码,我不知道如何将其转换为Python 3 – user2771714

回答

4

我不认为lambda表达式完全符合您通常期望它在Python 2中执行的操作。

Lambda表达式不会在其参数列表周围放置括号。正常的写法是lambda k, val: ...。 Python 2中会,然而,解析您的lambda表达式作为一个参数的函数,它会做拆包元组上的说法:

>>> a = lambda(a, b): a + b 
>>> a(1, 2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() takes exactly 1 argument (2 given) 
>>> a((1, 2)) 
3 

然而,tuple argument unpacking was abolished in Python 3,这就是为什么你在该声明出现语法错误。你要么必须删除括号并转换调用点调用函数有两个参数,或在lambda表达式本身使用显式拆包,有点像这样:

lambda tup: (tup[0], re.sub(..., ..., tup[1]))