Подтвердить что ты не робот

Почему распаковка этого объекта объекта карты "должна быть итерабельна, а не карта"?

Что здесь происходит?

>>> 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

Игнорируйте бессмысленность кода. Это сообщение об ошибке "итерируемый, а не карта". Карты являются итерабельными, не так ли?

И если я заменил 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. И googling "должен быть итерируемым, а не карточным" не находит никаких результатов. По-видимому, это что-то появилось совсем недавно.

Это просто ошибка Python? Или есть смысл в этом?

Обновление: Сообщить об ошибке, как это было предложено.

4b9b3361

Ответ 1

Я считаю, что это ошибка. Здесь источник, который вызывает это исключение:

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

Разбор байт-кода python подтверждает, что он использует BUILD_TUPLE_UNPACK_WITH_CALL

"Ошибка" в приведенном выше коде предполагает, что он принимает TypeError, а _PyList_Extend массив аргументов означает, что он не был итерируемым, однако сам __iter__ мог поднять TypeError. Это переосмысление этого исключения

Я предлагаю открыть ошибку в https://bugs.python.org