是否有一個Iterable對象可以持有的鉤子/dunder,以便內(nèi)置filter函數(shù)可以擴(kuò)展到Iterable類(而不僅僅是實例)?當(dāng)然也可以自己寫一個自定義filter_iter函數(shù),比如:def filter_iter(filt_func: callable, collection_cls: type): name = 'Filtered' + collection_cls.__name__ # would this automatic scheme lead to namespace conflicts? wrapped_cls = type(name, (collection_cls,), {'_filt_func': staticmethod(filt_func)}) def __iter__(self): yield from filter(self._filt_func, super(wrapped_cls, self).__iter__()) wrapped_cls.__iter__ = __iter__ return wrapped_cls這會產(chǎn)生預(yù)期的效果。例如,from collections import Collection, Iterableclass Chunker(Iterable): def __init__(self, source: Iterable, chk_size: int=2): self._source = source self._chk_size = chk_size def __iter__(self): yield from zip(*([iter(self._source)] * self._chk_size))chunker = Chunker(range(12), 2)assert list(chunker) == [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)]FilteredChunker = filter_iter(lambda x: sum(x) % 3 == 0, Chunker)filtered_chunker = FilteredChunker(range(12))assert list(filtered_chunker) == [(4, 5), (10, 11)]但是,就像有一個__iter__鉤子可以確定如何迭代一個對象(例如,list在對象上調(diào)用時應(yīng)該如何表現(xiàn)),是否有一種__filter__鉤子可以確定filter在該對象上調(diào)用時應(yīng)該如何表現(xiàn)?如果不是,關(guān)于過濾可迭代對象的最佳實踐或標(biāo)準(zhǔn)是什么?
Python:過濾可迭代類
呼喚遠(yuǎn)方
2022-12-06 15:29:13