将lambda函数转换为python 3

时间:2014-01-28 08:53:17

标签: python-3.x python-3.3

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

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

1 个答案:

答案 0 :(得分:5)

我认为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]))