我的GAE应用程序在我的电脑上运行得很好,但当我上传它时,我开始得到一个AttributeError,特别是:
AttributeError: 'dict' object has no attribute 'item'
我使用的是pylast接口(last.fm--link的一个API )。具体地说,我访问的是这种类型的变量列表:
SimilarItem = _namedtuple("SimilarItem", ["item", "match"])
我有一个这种类型的变量,名为sim
,当我得到属性错误时,我正在尝试访问sim.item
。
我应该注意到,我在我的计算机上使用的是Python2.6,并且我知道GAE运行在Python2.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
在这个令人沮丧的问题上,如果有任何帮助,我将不胜感激。提前谢谢。
发布于 2010-03-22 22:58:14
Python2.5没有namedtuple
。它是在2.6中添加的。
Python:看起来_namedtuple
函数是由pylast
提供的,它将在Python2.5或更早的版本中使用真正的namedtuple
,但在Python2.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
发布于 2010-03-22 23:17:25
是的,Python2.6主要是从backwards-compatible到2.5 --这意味着在2.5中运行的东西将主要在2.6中运行。但你似乎误解了backwards的意思--它是forwards的反义词,意思是在2.6中运行的东西(如果它使用了2.6中的新特性,但不是2.5中的新特性),完全可能不能在2.5(或以前的版本)中运行。您一定会看到,避免这种情况的唯一方法就是永远不要在新版本的中添加任何新特性--这是一个相当可怕的补救措施!
因此,我不建议您在本地的GAE开发中使用2.6,因为您知道生产版本将使用2.5。为什么不从python.org下载并安装Python2.5(如果您是在linux上,或者您的Linux发行版的特定代码库),并指示您的GAE SDK使用该版本,而不是2.6?这会让你的生活变得更轻松!
https://stackoverflow.com/questions/2493072
复制相似问题