Wolframalphaapi中的迭代错误是什么?我如何修复它



所以我正在制作一个简单的研究机器人,但我遇到了一个问题。我遵循了一个在python中使用wolfram-alpha的指南,当我测试它时,我有时会得到错误

Traceback (most recent call last):
File "python", line 6, in <module>
StopIteration`. 

这是我的代码:

import wolframalpha
import wikipedia
client = wolframalpha.Client('my_id')
q=input('Problem: ')
res = client.query(q)
print(next(res.results).text)

这种情况只发生在某些查询中,而且通常有效,但仍然相当烦人。我在网上查找了一下,但没有找到任何帮助,所以我不知道这是新的还是我的代码有问题。无论如何,这里有一个链接到我做的一个回复,它在这里不起作用。用";铀";我知道其中一个会带来错误,我尝试过的其他几个也是如此。谢谢

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


此行:

print(next(res.results).text)

…在迭代器res.results上调用next,但没有默认值:

通过调用迭代器的__next__()方法从迭代器中检索下一个项。如果给定了默认,则在迭代器耗尽时返回该值,否则将引发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可以像0一样容易地包含2或3个结果——这就是它返回迭代器的全部原因。通常,你会想要所有的,或者至少一小部分。如果是这种情况,最好的解决方案是使用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

相关内容

  • 没有找到相关文章

最新更新