簡體   English   中英

如何在python中使用yield來推遲條件語句中的評估?

[英]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.

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