2010-03-22 22 views
2

Mon application GAE fonctionne très bien de mon ordinateur, mais quand je le télécharger, je commence à obtenir un AttributeError, plus précisément:GAE AttributeError

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

J'utilise l'interface pylast (une API pour last.fm-- link). Plus précisément, j'accéder à une liste de variables de ce type:

SimilarItem = _namedtuple("SimilarItem", ["item", "match"]) 

je une variable de ce type, appelez-le sim, et je suis en train d'accéder sim.item quand je reçois l'erreur d'attribut.

Je dois noter que j'utilise Python 2.6 sur mon ordinateur, et je comprends que GAE fonctionne sur Python 2.5. Cela ferait-il une différence ici? Je pensais qu'ils étaient rétrocompatibles.

Enfin, je pense qu'il pourrait être un problème possible avec les modules que pylast importe - peut-être qu'ils ne fonctionnent pas avec GAE ou quelque chose? J'ai fait quelques recherches mais je n'ai pas obtenu de résultats. Voici les importations:

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 

J'apprécierais toute aide avec ce problème frustrant. Merci d'avance.

Répondre

3

Python 2.5 n'a pas namedtuple. Il a été ajouté en 2.6.

Edit: Il ressemble à la fonction _namedtuple est fournie par pylast et utilisera un vrai namedtuple en Python 2.6+ mais retombera à un vieux dict simple en Python 2.5 ou plus. Cela signifie que vous devrez utiliser sim['item'] ou sim.get('item') lors de l'exécution en production.

est ici la source pour cette fonction:

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 
+0

Merci! Cela a complètement réglé le problème. Votre réponse a été très informative et utile. – awegawef

4

Yep, Python 2.6 est la plupart du temps arrière à 2,5 compatible - cela signifie que ce fonctionne dans 2,5 se déroulera principalement en 2.6. Mais vous semblez mal comprendre ce arrièresignifie - c'est l'antonyme de avant, ce qui signifie qu'il est parfaitement possible que ce qui fonctionne en 2.6 (si elle utilise de nouvelles fonctionnalités qui sont 2.6, mais ne sont pas en 2.5) sera pas exécuté dans 2.5 (ou versions précédentes). Sûrement vous voyez que la seule façon d'éviter cela serait de ne jamais, jamais ajouter nouvelles fonctionnalités dans les nouvelles versions de Python - un remède assez terrible! -)

Donc je ne pense pas que vous êtes bien conseillé d'utiliser 2.6 pour votre développement local GAE, puisque vous savez que 2.5 est ce que la version de production utilisera. Pourquoi ne pas télécharger et installer un Python 2.5 de python.org (ou les dépôts spécifiques de votre distribution Linux, si vous êtes sur Linux) et pointez votre GAE SDK pour utiliser cette version, au lieu de 2.6? Cela rendrait votre vie beaucoup plus facile!

+0

Merci d'avoir éclairci mon malentendu - je ne réfléchissais pas clairement à la question. J'apprécie votre réponse. – awegawef