python - 如何制作可迭代对象(任何类型)的 _modified_ 副本?
问题描述
我想要一个可以制作可迭代对象的修改副本的函数。我希望它处理任何可迭代的对象。或者至少是内置类的任何可迭代实例。这是我到目前为止所拥有的:
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
等之类的事情,但这似乎很不合常理。对于添加可能执行必要的中间处理__new__
并__init__
接收正确类型的参数的选项,我有同样的看法,但这似乎也很不合情理。
解决方案
推荐阅读
- c# - 将行号添加到记录器
- c++ - 单独使用 const CString& 而不是 CString 作为函数参数是否有任何性能优势?
- powershell - powershell 管道不是通过调用表达式传递的
- python - pandas groupby 变换自定义函数
- python - 这两个代码块(如果有)之间的时间复杂度有什么区别,为什么?
- django - 如何在 Wagtail CMS 中使用 WYSIWYG 编辑器?
- php - 单击从 mysql 数据创建的链接时,JQuery 更改 div
- hugo - 修复 Hugo 中的“无效文件名”部署错误
- javascript - 如何在下面提到的场景中为爱好提供打字稿类型?
- c++ - C++ 预处理器会处理我当前 h 文件中包含的 ah 文件的内容吗