【发布时间】:2013-11-16 04:48:51
【问题描述】:
我正在用 python 编写一个生成器。它的行为很奇怪,如果我将 yield 语句留在原处,则永远不会调用函数顶部的 print 函数。如果我删除 yield 函数,打印语句会按预期发生。目前这是代码。
def eachMovement(self):
print "Each Movement..."
if not self.isComplete():
raise ValueError("DressageScore.eachMovement: dressage score must be designated as complete.")
for i in range(0, len(self.__iMovementScores)):
yield (self.__iMovementScores[i], self.__iMovementComments[i])
删除 yield 可解决此问题。我在这里做错了什么?为了澄清起见,我正在运行 Python 2.7.5。请不要说服我以不同的方式这样做,我的课程需要使用生成器。谢谢!
解决方案: 因为我在做测试驱动开发,所以我在编写函数的其余部分之前编写了 raise valueerror 测试。在将 eachMovement 完全转换为生成器后,我的测试用例失败了,因为它没有设置为测试生成器。我犯了一个愚蠢的错误。这是现在完成没有问题的测试用例。感谢您的所有帮助
def test1300_910_EachMovementNotComplete(self):
myGen = self.dsRider.eachMovement()
self.assertRaises(ValueError, myGen.next)
【问题讨论】:
-
在该行执行之前,您必须从生成器中消耗。通过
next或通过for等迭代它。 -
您能展示一下您是如何使用该功能的吗?在开始迭代生成器之前,不会执行生成器函数中的代码。
标签: python python-2.7 yield