所以我正在制作一个简单的研究机器人,但我遇到了一个问题。我正在关注在python中使用wolfram alpha的指南,当我测试它时,我有时会得到错误Traceback (most recent call last):
File "python", line 6, in <module>
StopIteration
。
这是我的代码:
import wolframalpha
import wikipedia
client = wolframalpha.Client('XPAQWX-PPQX4AHGAP')
q=input('Problem: ')
res = client.query(q)
print(next(res.results).text)
它只发生在一些查询中并且通常有效,但仍然相当烦人。我在线查看但没有找到任何帮助,所以我不知道这是新的还是我的代码有问题。无论如何,这里是一个链接到我做的repl不工作here。尝试用“铀”我知道一个人带来了错误,所以做了一些我尝试过的。谢谢!
此错误告诉您查询没有结果。
这一行:
print(next(res.results).text)
...在迭代器next
上调用res.results
,没有默认值:
通过调用
__next__()
方法从迭代器中检索下一个项目。如果给定default,则在迭代器耗尽时返回,否则引发StopIteration
。
如果res
没有结果告诉你,res.results
是一个空的迭代器。意思是它从一开始就用尽了,所以当你打电话给next
时,你会得到StopIteration
。
只是通过默认值并不会在这里做得多好。考虑一下:
print(next(res.results, None).text)
现在,如果没有结果,next
将返回你的默认值None
,你会立即尝试做None.text
,这只会引发一个AttributeError
。
解决此问题的一种方法是只处理错误:
try:
print(next(res.results).text)
except StopIteration:
print('No results')
另一个是将复合表达式分解为更简单的表达式,因此您可以使用默认值:
result = next(res.results, None)
print(res.text if res else 'No results')
但是,res
可以包含2或3个结果,就像0一样容易返回迭代器。通常情况下,你会想要所有这些,或者至少是其中的一部分。如果是这种情况,最好的解决方案是使用for
循环。迭代器诞生,希望它们可以在for
循环中使用,因为它使每个人都更容易:
for result in res.results:
print(result.text)
如果results
为空,则无效,如果只有一个,则打印一个结果,如果有多个,则打印所有结果。
如果你担心在你只需要几个时获得500个结果,你可以停下来,比方说3:
for result in itertools.islice(res.results, 3):
print(result.text)
… 要么:
for i, result in enumerate(res.results):
print(result.text)
if i > 2: break