为什么解压缩此地图对象打印“必须是可迭代的,而不是地图”?

时间:2017-07-28 01:08:59

标签: python python-3.6

这里发生了什么?

>>> 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现在,正如建议的那样。

1 个答案:

答案 0 :(得分:10)

我认为这是一个错误。以下是导致此异常的来源:

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

python字节码的反汇编确认它正在使用BUILD_TUPLE_UNPACK_WITH_CALL

上面代码中的“bug”是假定任何 TypeError_PyList_Extend参数数组意味着它不是可迭代的,但是{{1} }本身可能会引发TypeError。它正在重新抛出这个异常

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

打开一个错误