Поведение карты Python 3 против Python 2

В Python 2 распространенной (старой, устаревшей) идиомой является использованиеmap присоединиться к итераторам неравной длины, используя формуmap(None,iter,iter,...) вот так:

>>> map(None,xrange(5),xrange(10,12))
[(0, 10), (1, 11), (2, None), (3, None), (4, None)]

В Python 2 он расширен так, чтоlongest итератор - длина возвращаемого списка, и если один короче другого, он дополняетсяNone.

В Python 3 все по-другому. Во-первых, вы не можете использоватьNone в качестве аргумента для вызываемого в позиции 1:

>>> list(map(None, range(5),range(10,12)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

ОК, я могу это исправить так:

>>> def f(*x): return x    
... 
>>> list(map(f, *(range(5),range(10,12))))
[(0, 10), (1, 11)]

Но сейчас у меня другая проблема:map возвращаетshortest длина итератора - больше не заполняетсяNone.

Поскольку я портирую код Python 2 на Python 3, это не очень редкая идиома, и я не нашел простого решения на месте.

К сожалению, инструменты 2to3не поднимите это - бесполезно предлагая:

-map(None,xrange(5),xrange(10,18))
+list(map(None,list(range(5)),list(range(10,18)))) 

Предложения?

Edit

Существует некоторое обсуждение того, насколько распространена эта идиома.Смотрите этот пост.

Я обновляю написанный кодwhen I was still in high school. Посмотрите на учебники по Python 2003написано и обсуждено Раймондом Хеттингером с указанным специфическим поведением карты ...

Ответы на вопрос(3)

Ваш ответ на вопрос