2017-07-28 20 views
13

這是怎麼回事?爲什麼解開這個地圖對象的打印「必須是可迭代的,而不是地圖」?

>>> list(map(lambda *x: x, *map(None, 'abc'))) 
Traceback (most recent call last): 
    File "<pyshell#52>", line 1, in <module> 
    list(map(lambda *x: x, *map(None, 'abc'))) 
TypeError: type object argument after * must be an iterable, not map 

忽略代碼的毫無意義。這是關於錯誤消息,「可迭代,不映射」。地圖可迭代的,他們不是?

如果我只用str取代None,整個事情正常工作:

>>> list(map(lambda *x: x, *map(str, 'abc'))) 
[('a', 'b', 'c')] 

所以現在Python沒有任何問題與map那裏畢竟。

這發生在我的Python 3.6.1中。我的Python 3.5.2反而提高了預期的TypeError: 'NoneType' object is not callable。並且使用google搜索"must be an iterable, not map"根本找不到結果。所以顯然這是最近才引入的。

這只是一個Python bug?還是有一些意義呢?

更新:Reported as bug現在,建議。

+0

'打開一個bug「我的Python 3.5.2,而不是引發預期的類型錯誤:‘NoneType’對象不是可調用的」'這是奇怪的。在我的Python 3.4.4上,我得到(幾乎)和3.6一樣的錯誤:'TypeError:*之後的類型對象參數必須是一個序列,而不是映射' – DeepSpace

+0

有趣。我只是做了'm = map(None,'abc')'然後試圖做'def f(* args):print(args); f(* m)'和Python引發了一個'TypeError:'NoneType'對象不可調用。 –

+0

消息在提交中已更新:https://github.com/python/cpython/commit/7344285c1919e5ade8016a83a3ee02fd637a030d –

回答

10

我認爲這是一個錯誤。下面是導致該異常源:

https://github.com/python/cpython/blob/b1660800f4f519dbfab9e5a4ad3eae1cfabab3ed/Python/ceval.c#L2514-L2523

蟒蛇字節碼的拆卸證實了這一點,使用BUILD_TUPLE_UNPACK_WITH_CALL

的「錯誤」在上面的代碼它假定荷蘭國際集團任何TypeError_PyList_Extend參數數組意味着它不是可迭代的,但__iter__本身可能會引發TypeError。它重新拋出該異常

我建議在https://bugs.python.org

+2

我無法完全理解Python的C源代碼,但我認爲你是對的。我明天會報告(不是在早上3:34開始:-) –

相關問題