[英]How to use yield in python to defer evaluation in a conditional statement?
我希望在if語句中使用yield來推遲對回調函數的評估。 如果我執行以下操作:
def callback():
print "hi yield"
class dicTest():
e = {}
def eval(self):
yield callback()
並致電:
d = dicTest()
gen = d.eval()
gen.next()
gen = d.eval()
gen.next()
gen.next()
然后,最后一個gen.next()會按預期生成異常。 但是,我需要這樣做:
def callback():
print "hi yield"
class dicTest():
e = {}
def eval(self, cond):
if cond:
print "eval true"
else:
yield callback()
測試如下:
d = dicTest()
cond = True
gen = d.eval(cond)
print "next eval"
gen.next()
print "next cond"
cond = False
print "next eval false"
gen = d.eval(cond)
gen.next()
gen.next()
測試結果:
next eval
eval true
Traceback (most recent call last):
File "little.py", line 43, in <module>
gen.next()
StopIteration
為什么這會產生異常? 如何解決這個問題?
我認為您誤解了yield
運作方式。 yield
返回一個值,但保存生成器的狀態。 因此,下次您調用gen.next()
,生成器將在中斷的地方繼續運行。
在cond
為true的情況下,您可以打印某些內容,但實際上不會產生任何值。 我認為您想要的是:
if cond:
print "eval true"
yield "" # Some dummy value
yield callback()
請注意,如果cond
為true,則在回調之前會有一個額外的yield
。 生成器將不得不再調用next
一次,以便消耗該第一個yield
並進入回調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.