GAE AttributeError

时间:2010-03-22 14:44:34

标签: python google-app-engine 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

对于这个令人沮丧的问题,我将不胜感激。提前谢谢。

2 个答案:

答案 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