簡體   English   中英

創建后更新python生成器

[英]updating a python generator after it has been created

有什么辦法可以在python 2.7中做類似的事情?

def scaleit(g, k):
  for item in g:
    yield item*k

promise = ??????
# defines a generator for reference but not use:
# other functions can make use of it,
# but it requires a call to promise.fulfill() to
# define what the generator is going to yield;
# promise raises an error if next() is called 
# before the promise is fulfilled

f = scaleit(promise, 3)
promise.fulfill(range(10))

for item in f:
  print item

是; 生成器直到實際迭代后才運行,因此您可以將迭代實現的promise的值推遲到請求之前:

class Promise(object):
    def fulfill(self, result):
        self.result = result
    def __iter__(self):
        return iter(self.result)

def scaleit(g, k):
  for item in g:
    yield item*k

promise = Promise()
f = scaleit(promise, 3)
promise.fulfill(range(10))
print list(f)

我認為您想要在生成器上使用send()方法:

def gen():
    reply = yield None
    if not reply:  # reply will be None if send() wasn't called
        raise ValueError("promise not fulfilled")
    yield 5

g1 = gen()
next(g1)  # advance to the first yield
g1.send(True)
print(next(g1))  # prints 5

g2 = gen()
next(g2)
# forget to send
print(next(g2))  # raises ValueError

這是你想要的嗎?

def scaleit(g, k):
  for item in g:
    yield item * k

class Promise(object):
    def __init__(self):
        self.g = None

    def fulfill(self, g):
        self.g = iter(g)

    def __iter__(self):
        return self

    def next(self):
        return next(self.g)

promise = Promise()

f = scaleit(promise, 3)
promise.fulfill(range(10))

for item in f:
  print item

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM