gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:58:34 24 4
gpt4 key购买 nike

在某些情况下,使用具有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com