with tutorial framework espaƱol djangoproject desde con cero applications python python-2.7 urllib2 attributeerror canonical-quickly

python - framework - tutorial django



AttributeError(el objeto "str" no tiene atributo "leer") (3)

El problema es que para json.load debe pasar un archivo como objeto con una función de read definida. Entonces, o bien usa json.load(reponse) o json.loads(response.read()) .

En Python recibo un error:

Exception: (<type ''exceptions.AttributeError''>, AttributeError("''str'' object has no attribute ''read''",), <traceback object at 0x1543ab8>)

Dado el código python:

def getEntries (self, sub): url = ''http://www.reddit.com/'' if (sub != ''''): url += ''r/'' + sub request = urllib2.Request (url + ''.json'', None, {''User-Agent'' : ''Reddit desktop client by /user/RobinJ1995/''}) response = urllib2.urlopen (request) jsonofabitch = response.read () return json.load (jsonofabitch)[''data''][''children'']

¿Qué significa este error y qué hice para causarlo?


Si obtiene un error de Python como este:

AttributeError: ''str'' object has no attribute ''some_method''

Probablemente envenenó su objeto accidentalmente sobrescribiendo su objeto con una cadena.

Cómo reproducir este error en python con algunas líneas de código:

#!/usr/bin/env python import json def foobar(json): msg = json.loads(json) foobar(''{"batman": "yes"}'')

Ejecútelo, que imprime:

AttributeError: ''str'' object has no attribute ''loads''

Pero cambie el nombre de la variable y funciona bien:

#!/usr/bin/env python import json def foobar(jsonstring): msg = json.loads(jsonstring) foobar(''{"batman": "yes"}'')

Este error se produce cuando intentas ejecutar un método dentro de una cadena. String tiene algunos métodos, pero no el que está invocando. Así que deja de intentar invocar un método que String no define y comienza a buscar dónde envenenaste tu objeto.


AttributeError("''str'' object has no attribute ''read''",)

Esto significa exactamente lo que dice: algo intentó encontrar un atributo .read en el objeto que le diste, y le diste un objeto de tipo str (es decir, le diste una cadena).

El error ocurrió aquí:

json.load (jsonofabitch)[''data''][''children'']

Bueno, no está buscando read ninguna parte, por lo que debe suceder en la función json.load que llamó (como lo indica el rastreo completo). Eso es porque json.load está tratando de .read lo que le diste, pero le diste jsonofabitch , que actualmente nombra una cadena (que creaste al invocar .read en la response ).

Solución: no llame a .read usted mismo; la función hará esto y espera que le des la response directamente para que pueda hacerlo.

También podría haberse dado cuenta leyendo la documentación incorporada de Python para la función (pruebe la help(json.load) , o para todo el módulo (pruebe la help(json) ), o revisando la documentación de esas funciones en http : //docs.python.org .