如何制作可迭代对象(任何类型)的_modified_副本?

时间:2020-02-28 22:53:09

标签: python types copy generic-programming iterable

我想要一个可以制作可迭代对象的修改副本的函数。我希望它处理任何可迭代的对象。或至少一个内置类的可迭代实例。这是我到目前为止所拥有的:

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'

我想我可以编写一堆异常来处理诸如strmemoryview等之类的东西,但这似乎是不可思议的。对于添加可能执行__new____init__来接收正确类型的参数的中间处理所必需的选项,我有相同的想法,但这似乎也不合逻辑。

0 个答案:

没有答案