2010-03-22 36 views
2

我的GAE應用程序運行正常,從我的電腦,但是當我上傳,我開始變得一個AttributeError,具體是:GAE AttributeError的

AttributeError: 'dict' object has no attribute 'item' 

我使用pylast接口(用於last.fm--的API link)。具體來說,我訪問這種類型的變量列表:

SimilarItem = _namedtuple("SimilarItem", ["item", "match"]) 

我有這種類型的變量,稱之爲sim,我試圖訪問sim.item時,我得到的屬性錯誤。

我應該注意到我在我的計算機上使用了Python 2.6,並且我知道GAE在Python 2.5上運行。這會在這裏有所作爲嗎?我認爲他們是向後兼容的。

最後,我認爲這可能是pylast導入的模塊可能存在的問題 - 也許它們不適用於GAE或其他東西?我做了一些研究,但沒有得到任何結果。這裏是進口:

import hashlib 
import httplib 
import urllib 
import threading 
from xml.dom import minidom 
import xml.dom 
import time 
import shelve 
import tempfile 
import sys 
import htmlentitydefs 

我將不勝感激這個令人沮喪的問題的任何幫助。提前致謝。

回答

3

Python 2.5沒有namedtuple。它是在2.6中添加的。

編輯:它看起來像_namedtuple功能由pylast提供,將使用在Python 2.6+真正namedtuple但會回落到一個普通的老dict在Python 2.5或以上。這意味着在生產中運行時必須使用sim['item']sim.get('item')

下面是該函數的源:

def _namedtuple(name, children): 
    """ 
     collections.namedtuple is available in (python >= 2.6) 
    """ 

    v = sys.version_info 
    if v[1] >= 6 and v[0] < 3: 
     return collections.namedtuple(name, children) 
    else: 
     def fancydict(*args): 
      d = {} 
      i = 0 
      for child in children: 
       d[child.strip()] = args[i] 
       i += 1 
      return d 

     return fancydict 
+0

謝謝!這完全解決了這個問題。您的回覆非常豐富且有幫助。 – awegawef 2010-03-22 17:35:13

4

是的,Python 2.6中大多是向後兼容 2.5 - 這意味着什麼2.5運行將在2.6大多運行。但你似乎誤解了什麼向後意味着 - 它是轉發反義詞,這意味着它是完全可能的,什麼運行在2.6(如果它使用的新功能,在2.6,但不是在2.5)將不是運行在2.5(或以前的版本)。當然,你看到的是,只有這樣,才能避免將永遠,永遠加在Python的新版本任何新功能 - 一個非常可怕的補救措施 - !)

所以我不認爲你是好建議將2.6用於本地GAE開發,因爲您知道生產版本將使用2.5。爲什麼不從python.org(或您的Linux發行版的特定回購版,如果您在Linux上)下載並安裝Python 2.5,並指出您的GAE SDK使用版本,而不是2.6?這會讓你的生活更輕鬆!

+0

感謝您澄清我的誤解 - 我沒有清楚地思考這個問題。我感謝你的迴應。 – awegawef 2010-03-22 17:33:41