python通过返回嵌入式iterable使类可迭代

jzw*_*ner 12 python iterable

我在python中有一个类,它有一个可迭代的实例变量.我想通过迭代嵌入式迭代来迭代类的实例.

我实现如下:

def __iter__(self):
    return self._iterable.__iter__()
Run Code Online (Sandbox Code Playgroud)

我觉得__iter__()在iterable上调用方法并不是很舒服,因为它是一种特殊的方法.这是你如何在python中解决这个问题,还是有更优雅的解决方案?

Dav*_*ver 23

委派方式的"最佳"方式__iter__是:

def __iter__(self):
    return iter(self._iterable)
Run Code Online (Sandbox Code Playgroud)

或者,可能值得了解:

def __iter__(self):
    for item in self._iterable:
        yield item
Run Code Online (Sandbox Code Playgroud)

哪个会让你在返回之前摆弄每个项目(例如,如果你想要的话yield item * 2).

正如@Lattyware在评论中提到的那样,PEP380(计划包含在Python 3.3中)将允许:

def __iter__(self):
    yield from self._iterable
Run Code Online (Sandbox Code Playgroud)

请注意,执行以下操作可能很诱人:

def __init__(self, iterable):
    self.__iter__ = iterable.__iter__
Run Code Online (Sandbox Code Playgroud)

但这不起作用:直接iter(foo)调用__iter__方法type(foo),绕过foo.__iter__.例如,考虑一下:

class SurprisingIter(object):
    def __init__(self):
        self.__iter__ = lambda self: iter("abc")

    def __iter__(self):
        return iter([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

你会期望list(SurprisingIter())会返回["a", "b", "c"],但它实际上会返回[1, 2, 3].