Wolfram alpha迭代错误

问题描述 投票:0回答:1

所以我正在制作一个简单的研究机器人,但我遇到了一个问题。我正在关注在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。尝试用“铀”我知道一个人带来了错误,所以做了一些我尝试过的。谢谢!

python python-3.x wolframalpha stopiteration
1个回答
3
投票

此错误告诉您查询没有结果。


这一行:

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
© www.soinside.com 2019 - 2024. All rights reserved.