2014-01-28 50 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]))