Wolframalpha api中的迭代错误是什么?如何修复它?

2024-03-29 04:55:17 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在做一个简单的研究机器人,但我遇到了一个问题。我遵循了一个在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)

这种情况只发生在一些查询中,而且经常有效,但仍然相当烦人。我在网上查过,但没有找到任何帮助,所以我不知道这是新的还是我的代码有问题。无论如何,这里有一个链接,指向我制作的一个repl,它不工作here。用“铀”试试吧,我知道其中一个会带来错误,我也试过其他一些。谢谢


Tags: importalphaclientmost错误指南机器人res
1条回答
网友
1楼 · 发布于 2024-03-29 04:55:17

此错误表示您的查询没有结果


这一行:

print(next(res.results).text)

…在迭代器上调用^{},但不使用默认值:

Retrieve the next item from the iterator by calling its __next__() method. If default is given, it is returned if the iterator is exhausted, otherwise StopIteration is raised.

如果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

相关问题 更多 >