0

所以我正在制作一个简单的研究机器人,但我遇到了一个问题。我正在遵循在 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 在这里它不起作用的地方。用“铀”试试我知道一个会带来错误,我尝试过的其他几个也是如此。谢谢!

4

1 回答 1

3

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


这一行:

print(next(res.results).text)

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

通过调用迭代器的方法从迭代器中检索下一项__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
于 2018-07-15T19:50:18.380 回答