GAE 属性错误

2 投票
2 回答
744 浏览
提问于 2025-04-15 20:42

我的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 个回答

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呢?这样会让你的生活轻松很多!

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

撰写回答