2012-03-05 12 views
12

私はインスタンス変数として反復可能なPythonでクラスを持っています。私は埋め込まれたiterableを反復することによってクラスのインスタンスを繰り返したいと思う。pythonは組み込みのiterableを返すことによってiterableを作成します

次のように私はこれを実装:

def __iter__(self): 
    return self._iterable.__iter__() 

それは特別な方法であると私は本当に、快適で反復可能で__iter__()メソッドを呼び出すことを感じることはありません。これは、Pythonでこの問題を解決する方法ですか、より洗練されたソリューションですか? __iter__を委任する

+1

PEP 380(http://www.python.org/dev/peps/pep-0380/)に目を通し、 '' yield from self._iterable''でこれを可能にすることができます(これは3.3に含めることが認められている)。 –

答えて

22

方法に「最善」の方法は、次のようになります。

def __iter__(self): 
    return iter(self._iterable) 

代わりに、それは知っておく価値があるかもしれません:あなたが戻る前に、各項目をいじるようになる

def __iter__(self): 
    for item in self._iterable: 
     yield item 

それ(例えば、もしあなたが望むなら、yield item * 2)。

そして@Lattywareはコメントで言及として、(Pythonの3.3に含める予定)PEP380ができるようになります:のような何かをしたくてもよいことが

def __iter__(self): 
    yield from self._iterable 

注:

def __init__(self, iterable): 
    self.__iter__ = iterable.__iter__ 

をしかし、は動作しません。iter(foo)は、をバイパスして__iter__メソッドをtype(foo)に直接呼び出します。例えば、考えてみましょう:

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]を返します。

+0

はい、ありがとうございます。 – jzwiener

+0

非常に良い総合的な概要! – kindall

+0

PEP380の変種には、私が好むタイプミスがあります。それは 'def __iter __(self):yield from self._iterable'です。 – kap

関連する問題