代码之家  ›  专栏  ›  技术社区  ›  Tobbey

生成器是否可以通过多态性使用

  •  -1
  • Tobbey  · 技术社区  · 6 年前

    我甚至不知道这是否是正确的表达方式,但最近我在尝试使用对象中的方法时遇到了问题,既作为映射引擎(将闭包映射到迭代器的元素),又作为生成器的生成器。

    我可能更容易通过一个代码示例来解释这一点:

    class maybe_generator():
        def __init__(self, doer):
            self.doer = doer
    
        def give(self):
            for i in [1,2,3]:
                self.doer(i)
    
    
    def printer(x):
        print('This is {}'.format(x))
    def gener(x):
        yield(x)
    
    p = maybe_generator(printer)
    p.give()
    
    g = maybe_generator(gener)
    
    print('Type of result is {}'.format(g.give()))
    

    输出是

    This is 1
    This is 2
    This is 3
    Type of result is None
    

    我本希望g对象不是nonetype,而是generator类型。然后我想知道如何实现一个可能生成生成器的函数,或者直接对iterable执行一些边界效果。

    提前谢谢你的帮助

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tobbey    6 年前

    好吧,我终于找到了我要找的东西。有一个既可以作为映射引擎又可以作为生成器的函数可能需要一些技巧,但是我在我的用例中想要的基本上是得到一个递归生成器。

    这可以用关键字轻松完成

    产量从

    代码现在看起来像这样:

    class maybe_generator():
        def __init__(self, doer):
            self.doer = doer
    
        def give(self):
            for i in [1,2,3]:
                yield from self.doer(i)
    
    def gener(x):
        yield(x)
    
    g = maybe_generator(gener)
    gen = g.give()
    print('Type of result is {}'.format(gen))
    
    for k in gen:
        print('value is {}'.format(k))
    

    实际上,还值得看一看这一系列关于发电机和协程的高级课程: http://dabeaz.com/coroutines/