относительно ошибки объекта "генератор" не имеет атрибута "следующий" при использовании концепции генератора - PullRequest
0 голосов
/ 02 августа 2020

Я запускаю этот код, чтобы попытаться понять концепцию генератора,

class Pipeline(object):
    def __init__(self):
        self.source = None
    
    def __iter__(self):
        return self.generator()
    
    def generator(self):
        while True:
            value = self.source.next()
            if self.filter(value):
                yield self.map(value)
    
    def __or__(self, other):
        other.source = self.generator()
        return other
    
    def filter(self, value):
        return True
    
    def map(self, value):
        return value


class AllNumbers(Pipeline):
    def generator(self):
        value = 0
        while True:
            yield value
            value += 1


class Evens(Pipeline):
    def filter(self, value):
        return value % 2 == 0


class MultipleOf(Pipeline):
    def __init__(self, factor=1):
        self.factor = factor
        super(MultipleOf, self).__init__()
        
    def filter(self, value):
        return value % self.factor == 0


class Printer(Pipeline):
    def map(self, value):
        print(value)
        return value


class First(Pipeline):
    def __init__(self, total=10):
        self.total = total
        self.count = 0
        super(First, self).__init__()
    
    def map(self, value):
        self.count += 1
        if self.count > self.total:
            raise StopIteration
        return value


def main():
    all_numbers = AllNumbers()
    evens = MultipleOf(2)
    multiple_of_3 = MultipleOf(3)
    printer = Printer()
    first_10 = First(10)
    pipeline = all_numbers | evens | multiple_of_3 | first_10 | printer
    
    for i in pipeline:
        pass


if __name__ == '__main__':
    main()

Но я получил следующее сообщение об ошибке. В чем может быть причина?

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-d12e8d90a637> in <module>
     77 
     78 if __name__ == '__main__':
---> 79     main()

<ipython-input-13-d12e8d90a637> in main()
     72     pipeline = all_numbers | evens | multiple_of_3 | first_10 | printer
     73 
---> 74     for i in pipeline:
     75         pass
     76 

<ipython-input-13-d12e8d90a637> in generator(self)
      8     def generator(self):
      9         while True:
---> 10             value = self.source.next()
     11             if self.filter(value):
     12                 yield self.map(value)

AttributeError: 'generator' object has no attribute 'next'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...