python - 能够在不使用yield的情况下使用类似生成器的函数吗? (Python3.x)

标签 python generator

在某些情况下,使用具有 yield 的生成器可以方便地在较长时间内将数据传回给调用者。有没有一种方法可以做类似 yield 的事情,而不必将函数变成生成器?

这样做的原因是,在某些情况下,当这些嵌套函数可能具有有用的返回值时,我最终不得不将所有被调用者放入生成器中。

# currently this works fine, but requires a return arg

def nested(return_store):
    return_store[0] = some_test()
    yield from some_generator()

def do_stuff(return_store):

    yield some_data

    for more_data in data:
        yield more_data

    # Annoying workaround!
    return_store = [None]
    yield from nested(return_store)
    if return_store[0]:
        pass  # do anything


def main():
    return Reply(do_stuff())

相反,我想传递一个对象作为参数,我可以将参数传递给它(而不是使用yield)

# is something like this possible?
def nested(iter_obj):
    iter_obj.yield_replacement(some_generator())
    return some_test()

def do_stuff(iter_obj):

    iter_obj.yield_replacement(some_data)

    for more_data in data:
        iter_obj.yield_replacement(more_data)

    # No annoying workaround
    if nested(iter_obj):
        pass  # do anything

def main():
    iter_obj = yield_replacement_object(consumer=print)
    # sets up the generator (Reply should consume iter_obj)
    do_stuff(iter_obj)
    return Reply(iter_obj)

最佳答案

生成器只是迭代器的一种形式。任何实现 iterator protocol 的东西就可以了。

这意味着您可以用具有更多属性的对象替换嵌套函数:

class Nested():
    def __iter__:
        self.some_flag = some_test()
        yield data

我什至将 __iter__ 方法实现为生成器函数。

然后随意使用生成器中的对象:

n = Nested()
yield from n
if n.some_flag:
    # ...

另一种方法是抛出异常;如果您尝试传达一些带外状态更改,请抛出异常并在父生成器中捕获它。

关于python - 能够在不使用yield的情况下使用类似生成器的函数吗? (Python3.x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26800276/

相关文章:

c++ - 我正在尝试生成随机数,但每次出现错误 ‘ranf’ 未在此范围内声明

python - 拼图 : Recursive generator without loops/imports

python - 列表推导和生成器表达式中的 yield

c# - C++ 等效于 C# Yield?

python - 如何用 Python 杀死 Linux 进程

Python - 如何从类方法中获取类名 - 使用@classmethod

Python 子文件夹列表

python - 如何使用 Python 求解一对非线性方程?

python - Hook 生成器函数的最佳方法(如果有)

python - 加粗一个像素线