我有这段代码,我读了一些关于将python 2转换为python 3的内容,但是我遇到了问题。
lambda(k, val): (k,
re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);",
self._convertEntities,
val))
答案 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]))