2016-04-02 2 views
0

Je suis nouveau à l'Wolfram | Alpha API pour Python et je ne pouvais pas trouver beaucoup d'aide sur Internet, donc je tourné vers le débordement de pile. Je reçois le "NameError: nom 'pod' n'est pas défini" sur QUELQUES requêtes sur Wolfram | Alpha. Toute aide serait très appréciée. Lorsque j'ai saisi ma requête "Longueur d'une Ferrari 458", je me retrouvais avec l'erreur StopIteration, maintenant j'ai changé le code pour utiliser la méthode "pods". Maintenant, je reçois un NameError. La sortie devrait me donner la longueur de la voiture (https://www.wolframalpha.com/input/?i=length+of+ferrari+458) Je devais x sur app_id car ce n'est pas le mien, désolé pour le dérangement.Wolfram | Alpha API Python NameError: nom « pod » est pas défini

#!/usr/bin/python 
import wolframalpha 
app_id=('xxxxxx-xxxxxxxxxx') 
client = wolframalpha.Client(app_id) 

query = input("Query:") 
if len(res.pods) > 0: 
texts = "" 
pod = res.pods[1] 

if pod.text: 
    texts = pod.text 

else: 
    texts = "I have no answer for that" 

texts = texts.encode('ascii', 'ignore') 
print (texts) 

L'erreur que je reçois:

Query: length of ferrari 458 
    Traceback (most recent call last): 
    File "Wolfram.py", line 24, in <module> 
     if pod.text: 
    NameError: name 'pod' is not defined 
+1

Le générateur 'res.results' est vide. Je ne suis pas familier avec l'API, peut-être 'res.pods' partage le même générateur? –

+0

Veuillez mettre à jour votre question pour ajouter la sortie que vous * attendez * à la place. –

+0

La [documentation] (https://pypi.python.org/pypi/wolframalpha) suggère que vous devez utiliser * one * ou * l'autre *, pas les deux techniques. –

Répondre

0

Si une séquence est vide next déclenche une exception.

col None en tant que second paramètre de retour en tant que valeur par défaut. De l'documentation lié:

next(iterator[, default])
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.

S'il n'y a pas de résultats et vous ne voulez pas gérer l'exception:

first = next(res.results, None) 
if first: 
    print(first.text) 

S'il n'y a pas de résultats, first seront None, que vous pouvez ensuite vérifiez avant d'essayer de l'utiliser.

+0

Yup, 'next()' peut retourner un défaut, mais cela ne va pas aider à résoudre le problème qu'il n'y a pas de résultats cependant. Et puis vous obtiendrez une erreur d'attribut sur '.text'. –

+0

La question est posée comme un problème 'StopIteration' plutôt qu'un problème d'attribut' results' vide. –

+0

Je voudrais pouvoir interroger sans aucune erreur se produisant évidemment. Par exemple, ma contribution: "Vitesse maximale pour Ferrari 458" et je veux qu'elle revienne sans StopIteration. Comme je suis nouveau, je ne comprends pas en passant aucun en tant que second paramètre à retourner en tant que défaut. –

0

Si vous prévoyez d'utiliser le générateur à deux reprises, sans faire la requête deux fois, vous pouvez utiliser itertools.tee avoir deux copies du générateur pour vous d'utiliser:

from itertools import tee 

res1, res2 = tee(res, 2) 

# consume the first generator: 
for pod in res1: 
    ... 
    ... 

# you have a second generator you can use: 
print(next(res2.results).text) 
... 
... 
0

Le source code montre que res.pods et res.results parts le même itérateur. L'erreur que vous obtenez signifie simplement qu'il y a aucun résultat. Essayez une requête différente.

Les travaux exemple de requête, par exemple:

>>> res = client.query('temperature in Washington, DC on October 3, 2012') 
>>> print(next(res.results).text) 
(21 to 27) °C (average: 24 °C) 
(Wednesday, October 3, 2012) 
>>> [p.title for p in res] 
['Input interpretation', 'Result', 'History', 'Weather station information'] 

Votre requête spécifique ne renvoie aucun résultat, apparemment parce qu'il ya des hypothèses pour confirmer; visite http://api.wolframalpha.com/v2/query?input=length+of+a+Ferrari+458&appid=<your-app-id> produit:

<?xml version='1.0' encoding='UTF-8'?> 
<queryresult success='false' 
    error='false' 
    numpods='0' 
    datatypes='' 
    timedout='' 
    timedoutpods='' 
    timing='2.742' 
    parsetiming='0.79' 
    parsetimedout='false' 
    recalculate='' 
    id='MSPa12051ddfeh1dgh883d2e000035eh08fba72b042e' 
    host='http://www4f.wolframalpha.com' 
    server='9' 
    related='' 
    version='2.6' 
    profile='EnterDoQuery:0.,StartWrap:2.74235'> 
<didyoumeans count='2'> 
    <didyoumean score='0.365929' level='medium'>Ferrari 458</didyoumean> 
    <didyoumean score='0.26087' level='low'>length</didyoumean> 
</didyoumeans> 
</queryresult> 

Comment vous pouvez obtenir à partir de là à la requête 2015 Ferrari 458 Italia | overall length que l'interface Web parvient à extraire n'est pas clair à partir de la documentation de l'API.

Vous pouvez accéder aux éléments didyoumean via l'attribut Result.tree, en utilisant les ElementTree API:

>>> res = client.query('length of a Ferrari 458') 
>>> for didyoumean in res.tree.findall('//didyoumean'): 
...  print didyoumean.text 
... 
Ferrari 458 
length 
+0

Merci Martijin, utile mais ne me donne toujours pas de réponse à ma question. N'y a-t-il pas moyen de répondre à l'aide de l'API Wolfram? –

+0

Je n'ai pas trouvé un moyen. La documentation de l'API ne donne aucun indice non plus. –