这里发生了什么?
>>> 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
忽略代码的无意义。这是关于错误消息,“iterable,not map”。地图是可迭代的,不是吗?
如果我只用None
替换str
,整件事情就可以了:
>>> 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
。谷歌搜索"must be an iterable, not map"根本找不到任何结果。显然这是最近才引入的。
这只是一个Python错误吗?或者对此有何看法?
更新: Reported as bug现在,正如建议的那样。
答案 0 :(得分:10)
我认为这是一个错误。以下是导致此异常的来源:
python字节码的反汇编确认它正在使用BUILD_TUPLE_UNPACK_WITH_CALL
上面代码中的“bug”是假定任何 TypeError
而_PyList_Extend
参数数组意味着它不是可迭代的,但是{{1} }本身可能会引发TypeError。它正在重新抛出这个异常