GAE AttributeError - PullRequest
       8

GAE AttributeError

2 голосов
/ 22 марта 2010

Мое приложение GAE отлично работает с моего компьютера, но когда я загружаю его, я начинаю получать AttributeError, а именно:

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

Я использую интерфейс Pylast (API для last.fm - ссылка ). В частности, я обращаюсь к списку переменных этого типа:

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 голосов
/ 22 марта 2010

Да, Python 2.6 в основном в обратном направлении - совместим с 2.5 - это означает, что то, что работает в 2.5, будет в основном работать в 2.6. Но вы, похоже, неправильно понимаете, что назад означает - это антоним форвардов , что означает, что вполне возможно, что то, что работает в 2.6 (если оно использует новые функции в версии 2.6, но не в версии 2.5) не будет работать в версии 2.5 (или в предыдущих версиях). Конечно, вы видите, что единственный способ избежать этого - никогда не добавлять какие-либо новые функции в новые версии Python - довольно страшное средство! -)

Так что я не думаю, что вам рекомендуется использовать 2.6 для локальной разработки GAE, поскольку вы знаете, что 2.5 будет использовать рабочая версия. Почему бы не загрузить и не установить Python 2.5 с python.org (или с конкретными репозиториями вашего linux-дистрибутива, если вы работаете в Linux) и указать вашему GAE SDK на использование этой версии 2,6? Это значительно облегчит вашу жизнь!

3 голосов
/ 22 марта 2010

Python 2.5 не имеет namedtuple.Это было добавлено в 2.6.

Редактировать: Похоже, что функция _namedtuple предоставляется pylast и будет использовать реальный namedtuple в Python 2.6+, но вернется к простой старой dict в Python 2.5 или старше.Это означает, что вам придется использовать 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
...