Em Python I'estou a receber um erro:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Dado o 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']
O que significa este erro e o que fiz eu para o causar?
O problema é que para json.load' deve passar um ficheiro como um objecto com uma função
read' definida. Assim, ou se utiliza json.load(response)
ou json.loads(response.read())
.
AttributeError("'str' object has no attribute 'read'",)
Isto significa exactamente o que diz: algo tentou encontrar um atributo .read' no objecto que lhe deu, e deu-lhe um objecto do tipo
str' (ou seja, deu-lhe uma corda).
O erro ocorreu aqui:
json.load (jsonofabitch)['data']['children']
Bem, está'não está à procura de "ler" em lado nenhum, por isso deve acontecer na função "json.load" que chamou (como indicado pelo traceback completo). Isto porque json.load' está a tentar
.ler' o que lhe deu, mas deu-lhe jsonofabitch', que actualmente nomeia uma cadeia (que criou ao chamar
.read' na função `resposta').
Solução: don'não chame .read
a si mesmo; a função fará isto, e espera que lhe dê a resposta
directamente para que o possa fazer.
Também poderia ter descoberto isto lendo a documentação Python incorporada para a função (tente help(json.load)
, ou para todo o módulo (tente help(json)
), ou verificando a documentação para essas funções em http://docs.python.org .
Se obtiver um erro de pitão como este:
AttributeError: 'str' object has no attribute 'some_method'
Provavelmente envenenou o seu objecto acidentalmente, substituindo o seu objecto por um fio.
Como reproduzir este erro em pitão com algumas linhas de código:
#!/usr/bin/env python
import json
def foobar(json):
msg = json.loads(json)
foobar('{"batman": "yes"}')
Executá-lo, o que imprime:
AttributeError: 'str' object has no attribute 'loads'
Mas mude o nome da variablename, e funciona bem:
#!/usr/bin/env python
import json
def foobar(jsonstring):
msg = json.loads(jsonstring)
foobar('{"batman": "yes"}')
Este erro é causado quando se tenta executar um método dentro de uma cadeia. O String tem alguns métodos, mas não aquele que está a invocar. Por isso, pare de tentar invocar um método que String não define e comece a procurar onde envenenou o seu objecto.