我有一個Python中的類,它有一個可迭代的實例變量。我想通過遍歷嵌入式迭代器迭代類的實例。python使類迭代返回嵌入迭代
我實現了這個如下:
def __iter__(self):
return self._iterable.__iter__()
我真的不覺得舒服調用__iter__()
方法上的迭代,因爲它是一種特殊的方法。這是你如何解決這個問題在python中還是有一個更優雅的解決方案?
我有一個Python中的類,它有一個可迭代的實例變量。我想通過遍歷嵌入式迭代器迭代類的實例。python使類迭代返回嵌入迭代
我實現了這個如下:
def __iter__(self):
return self._iterable.__iter__()
我真的不覺得舒服調用__iter__()
方法上的迭代,因爲它是一種特殊的方法。這是你如何解決這個問題在python中還是有一個更優雅的解決方案?
「最好」的方式的方式來委託__iter__
是:
def __iter__(self):
return iter(self._iterable)
或者,它可能是值得了解:
def __iter__(self):
for item in self._iterable:
yield item
這將讓你與每個項目撥弄返回前它(例如,如果你想yield item * 2
)。
而作爲@Lattyware在評論中提到,PEP380(預計列入的Python 3.3)將允許:
def __iter__(self):
yield from self._iterable
注意,它可能是很有誘惑力的做一些事情,如:
def __init__(self, iterable):
self.__iter__ = iterable.__iter__
但是這個將不起作用:iter(foo)
直接調用方法type(foo)
,繞過foo.__iter__
。舉個例子:
class SurprisingIter(object):
def __init__(self):
self.__iter__ = lambda self: iter("abc")
def __iter__(self):
return iter([1, 2, 3])
你會認爲list(SurprisingIter())
將返回["a", "b", "c"]
,但它實際上返回[1, 2, 3]
。
你可能想要關注PEP380(http://www.python.org/dev/peps/pep-0380/),它可以通過'self._iterable'產生這個可能(this被接納列入3.3)。 – 2012-03-05 20:44:53