2016-04-02 17 views
0

Python için Wolfram | Alpha API'sinde yeniyim ve internette fazla yardım bulamadım, bu yüzden taşmaya yığdım. Wolfram | Alpha üzerinde BAZI sorgular üzerinde "NameError: name 'pod' tanımlı değil" aldım. Herhangi bir yardım çok takdir edilecektir. "Ferrari 458'in Uzunluğu" sorgumu girdiğimde, StopIteration hatasıyla bitiyordum, şimdi kodu "bölmeler" yöntemini kullanacak şekilde değiştirdim. Şimdi bir NameError aldım. Out out bana araba uzunluğu vermelidir (https://www.wolframalpha.com/input/?i=length+of+ferrari+458) Ben app_id dışarı benim x gibi zorundaydı, rahatsızlık için özür dilerim.Wolfram | Alpha API Python NameError: name 'pod' tanımlı değil

#!/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) 

hata alıyorum: Bir sıra boş

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

'res.results' jeneratör boştur. API ile aşina değilim, belki 'res.pods' aynı jeneratörü paylaşıyor mu? –

+0

Lütfen bunun yerine hangi çıkışı * beklenen * eklemek için sorunuzu güncelleyin. –

+0

[belgeler] (https://pypi.python.org/pypi/wolframalpha), her iki teknikte de değil, * bir * veya * diğer * değerini kullanmanızı önerir. –

cevap

0

Eğer next bir özel durum oluşturur.

Varsayılan olarak dönmek üzere None değerini ikinci bir parametre olarak geçirin. Orada hiçbir sonuç vardır ve durum işlenecek istemiyorsanız

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.

: Hiçbir sonuç varsa

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

, firstNone, olacak o zaman can documentation bağlantılı Gönderen Kullanmaya çalışmadan önce kontrol edin. iki kez sorgu yapmadan iki kez jeneratör kullanmayı planlıyorsanız kullanmak için

+0

Yup, 'next()' bir varsayılanı döndürebilir, ancak bu, hiçbir sonucun olmadığı sorunu çözmenize yardımcı olmaz. Ve sonra '.text'de bir özellik hatası alırsınız. –

+0

Soru, boş bir 'results' özellik sorunu yerine bir' StopIteration 'sorunu olarak ortaya çıkar. –

+0

Açıkça meydana gelen bir hata olmadan sorgulayabilmek istiyorum. Örneğin benim girdim: "Ferrari 458 için en yüksek hız" ve bunun StopIteration ile geri dönmesini istiyorum. Yeni olduğum için, varsayılan olarak geri dönecek ikinci bir parametre olarak hiçbirini pasif olarak anlamıyorum. –

0

, sen jeneratörün iki kopyası olması itertools.tee kullanabilirsiniz:

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

source code gösterir res.pods ve res.results payı olduğunu aynı yineleyici. Aldığınız hata sadece sonuç yok demektir. Farklı bir sorguyu deneyin.

örnek sorgu örneğin çalışır:

>>> 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'] 

Sizin özel sorgu onaylamak için varsayımlar vardır çünkü görünüşte herhangi bir sonuç vermez; http://api.wolframalpha.com/v2/query?input=length+of+a+Ferrari+458&appid=<your-app-id> ziyaret üretir: Eğer web arayüzü ayıklamak için yönetir 2015 Ferrari 458 Italia | overall length sorguya oradan nasıl

<?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> 

API belgelerinden açık değildir.

Sen can erişim ElementTree API kullanılarak Result.tree özelliyle didyoumean elemanları:

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

Teşekkürler Martijin, yararlı ama hala bana sorguma bir cevap vermiyor. Wolfram API'sı kullanılarak yanıtlanması için bir yolu yok mu? –

+0

Bir yol bulamadım. API belgeleri de herhangi bir ipucu vermez. –

İlgili konular