(内部) イテレータをラップする場合、__iter__
メソッドを基礎となるイテラブルに再ルーティングする必要があることがよくあります。次の例を検討してください。
class FancyNewClass(collections.Iterable):
def __init__(self):
self._internal_iterable = [1,2,3,4,5]
# ...
# variant A
def __iter__(self):
return iter(self._internal_iterable)
# variant B
def __iter__(self):
yield from self._internal_iterable
バリアント A と B に大きな違いはありますか? iter()
バリアント A は、内部 iterable からクエリされた iterator オブジェクトを返します。バリアント B は、内部 iterable から値を返すジェネレーター オブジェクトを返します。何らかの理由でどちらかが望ましいですか?バージョンで使用されますcollections.abc
。yield from
バリアントは、return iter()
私が今まで使用してきたパターンです。