2

我的 GAE 应用程序在我的计算机上运行良好,但是当我上传它时,我开始收到 AttributeError,具体来说:

AttributeError: 'dict' object has no attribute 'item'

我正在使用 pylast 接口(last.fm-- link的 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

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

4

2 回答 2

4

是的,Python 2.6 大多向后兼容 2.5——这意味着在 2.5 中运行的大部分将在 2.6 中运行。但是您似乎误解了向后的 含义-它是forwards的反义词,这意味着在 2.6 中运行的内容(如果它使用 2.6 中但不在 2.5 中的新功能)完全有可能不会在 2.5(或以前版本)。当然,您会看到避免这种情况的唯一方法是永远不要在新版本的 Python 中添加任何新功能——这是一个非常可怕的补救措施!-)

因此,我认为不建议您在本地 GAE 开发中使用 2.6,因为您知道生产版本将使用 2.5。为什么不从python.org下载并安装 Python 2.5 (或者你的 linux 发行版的特定存储库,如果你在 Linux 上)并让你的 GAE SDK 使用那个版本,而不是 2.6?这将使您的生活变得更加轻松!

于 2010-03-22T15:17:25.337 回答
3

Python 2.5 没有namedtuple. 它是在 2.6 中添加的。

编辑:看起来该_namedtuple函数由Python 2.6+提供pylast并将使用一个实数,但在 Python 2.5 或更早版本中将回退到一个普通的旧函数。这意味着您必须在生产环境中使用或运行。namedtupledictsim['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-22T14:58:14.373 回答