Как вы делаете _модифицированную_ копию итерируемого объекта (любого типа)? - PullRequest
0 голосов
/ 29 февраля 2020

Мне нужна функция, которая может создавать модифицированные копии итерируемых объектов. Я хотел бы, чтобы он обрабатывал любой повторяемый объект. Или, по крайней мере, любой повторяемый экземпляр встроенного класса. Это то, что у меня есть:

def doppelgänger(function, iterable): # FYI, ord('ä') == 228 == 0xe4
    '''Similar to map, except that the return is of the same
    type as iterable, and that there are only two arguments.
    '''
    d = iterable.__new__(type(iterable), map(function, iterable))
    d.__init__(map(function, iterable))
    return d

inc = lambda x: x + 1

doppelgänger(inc, (1,))
# (2,)

doppelgänger(inc, [1])
# [2]

doppelgänger(inc, set([1]))
# {2}

doppelgänger(inc, frozenset((1,)))
# frozenset({2})

doppelgänger(inc, deque([1]))
# deque([2])

Пока все хорошо. Тем не менее:

doppelgänger(lambda x: x, 'a')
# '<map object at 0x00000215DA88DC18>'

doppelgänger(lambda x: x, memoryview(bytes(1)))
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 4, in doppelgänger
# TypeError: memoryview: a bytes-like object is required, not 'map'

Полагаю, я мог бы написать кучу исключений для обработки таких вещей, как str, memoryview и т. Д. 1012 *., Но это выглядит не pythoni c. У меня такое же чувство, что я добавляю опции, которые могут выполнять промежуточную обработку, необходимую для __new__ и __init__, чтобы получить правильные типы аргументов, но это тоже кажется unpythoni c.

...