我的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
对于这个令人沮丧的问题,我将不胜感激。提前谢谢。
答案 0 :(得分:4)
是的,Python 2.6主要是向后 - 与2.5兼容 - 这意味着在2.5中运行的内容主要在2.6中运行。但是你似乎误解了向后 意味着什么 - 它是前进的反义词,这意味着它完全有可能在2.6中运行(如果它使用2.6中但不在2.5中的新功能不在2.5(或以前的版本)中运行。当然,你会发现避免这种情况的唯一方法就是永远不要在新版本的Python中添加任何新功能 - 这是一个非常可怕的补救措施! - )
所以我认为你不建议在你的本地GAE开发中使用2.6,因为你知道2.5是生产版本将使用的。为什么不从python.org(或者你的Linux发行版的特定存储库,如果你在Linux上)下载并安装Python 2.5并指出你的GAE SDK使用那个版本,而不是2.6?这会让你的生活变得更加轻松!
答案 1 :(得分:3)
Python 2.5没有namedtuple
。它是在2.6中添加的。
修改 _namedtuple
函数似乎由pylast
提供,并且将在Python 2.6+中使用真实的namedtuple
,但会回归到Python 2.5或更早版本中的普通旧dict
。这意味着在生产中运行时,您必须使用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