【发布时间】:2014-02-28 12:40:20
【问题描述】:
我有这段代码,它不起作用,我不知道为什么。
我的数据结构:
- "genes" 是一个字典,它的 ID 作为键,作为值的倍数 对象 Gene 的实例。
- Gene 对象包含一个类似的字典,其中包含 对象“成绩单”。
最后,“parent”是一个 Transcript(字符串)的 ID。 我需要获取与字符串“parent”具有相同 ID 的 Transcript 实例 (ptrans)。 它位于其中一个 Gene 实例中。
当我在底部运行代码时,我没有得到一个真正的异常,而是一个“StopIteration”,我认为我捕获了它,然后它应该继续下一个 Gene 对象,对吗?:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
ptrans = next(t for t in g.transcripts.values() if t.ID == parent)
StopIteration
我可以使用嵌套的 for 循环来做到这一点,但我认为这也可以。我只是无法理解这不起作用的事实。谁能解释一下为什么,或者它是如何工作的?
# iterate over Gene-dict
for g in genes.values():
#Iterate over Transcripts in 1 Gene
try:
ptrans = next(t for t in g.transcripts.values() if t.ID == parent)
#If no match, continue
except StopIteration:
continue
if ptrans:
break
【问题讨论】:
-
看来你应该抓住它了。你可以发布一个minimal runnable example 来演示运行时的问题吗?在剥离代码和回溯时,您似乎隐藏了错误的原因。
-
您的回溯未显示您的代码具有的
try块。 -
你为什么要在那里休息? break 将停止 for 循环,因此它看起来一旦成功运行一次就会停止。这是故意的吗?
-
continue “切断”当前迭代并从下一项开始。因此,如果 ptrans 被定义,则没有 StopIteration,这意味着它已经找到了 ID,然后它可以跳出 for 循环。
-
next()有一个可选的second parameter,这意味着您可以执行if next(iter, None) is None而不是捕获StopIteration异常。
标签: python loops for-loop iterator