GAE 属性错误
我的GAE应用在我电脑上运行得很好,但当我上传后,就开始出现一个属性错误,具体是:
AttributeError: 'dict' object has no attribute 'item'
我正在使用pylast接口(这是一个用于last.fm的API——链接)。具体来说,我在访问这种类型的变量列表:
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
我会很感激任何关于这个令人沮丧的问题的帮助。提前谢谢你。
2 个回答
没错,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呢?这样会让你的生活轻松很多!
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