Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用yield延迟条件语句中的求值?_Python_Conditional Statements_Yield - Fatal编程技术网

如何在python中使用yield延迟条件语句中的求值?

如何在python中使用yield延迟条件语句中的求值?,python,conditional-statements,yield,Python,Conditional Statements,Yield,我希望在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

我希望在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
下一次评估
评估真实
回溯(最近一次呼叫最后一次):
文件“little.py”,第43行,在
下一代
停止迭代

为什么会产生异常?如何解决这个问题

我想你误解了
收益率的工作原理
yield
返回一个值,但保存生成器的状态。因此,下次调用
gen.next()
时,生成器将从它停止的地方开始

在您的情况下,当
cond
为true时,您打印了一些内容,但从未实际生成值。我想你想要的是:

if cond: 
    print "eval true"
    yield "" # Some dummy value
yield callback() 

请注意,这里当
cond
为true时,回调之前还有一个额外的
yield
。生成器必须再次调用
next
,才能使用第一个
生成
并返回回调。

您能否将输入和输出分开,以便我们了解发生了什么以及何时发生的情况?这是您的真实代码吗?这可能与dict是一个共享类属性而不是一个实例变量这一事实有关吗?您对第二个示例代码的“测试”应该在第一个
gen.next()
上提高
StopIteration
,因为您只是
print
,而
不产生任何结果。您期望的结果是什么?您希望它返回什么?我认为这并不是
yield
的一个很好的用途。为什么不直接返回回调函数本身并让调用者调用它呢?如果你还不想计算回调函数,你应该返回函数
callback
,而不是
callback()
,函数值,但我可能不明白你想做什么。