I Python får jeg en feil:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Gitt python-kode:
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']
Hva betyr denne feilen, og hva har jeg gjort for å forårsake den?
Problemet er at for json.load
bør du sende et fillignende objekt med en read
-funksjon definert. Så enten bruker du json.load(response)
eller json.loads(response.read())
.
AttributeError("'str' object has no attribute 'read'",)
Dette betyr akkurat det det står: noe prøvde å finne et .read
-attributt på objektet du ga det, og du ga det et objekt av typen str
(dvs. du ga det en streng).
Feilen oppstod her:
json.load (jsonofabitch)['data']['children']
Vel, du leter ikke etter read
noe sted, så det må skje i json.load
-funksjonen som du kalte (som indikert av full traceback). Det er fordi json.load
prøver å .read
det du ga den, men du ga den jsonofabitch
, som for øyeblikket heter en streng (som du opprettet ved å kalle .read
på response
).
Løsning: ikke kall .read
selv; funksjonen vil gjøre dette, og forventer at du gir den response
direkte slik at den kan gjøre det.
Du kunne også ha funnet ut av dette ved å lese den innebygde Python-dokumentasjonen for funksjonen (prøv help(json.load)
, eller for hele modulen (prøv help(json)
), eller ved å sjekke dokumentasjonen for disse funksjonene på http://docs.python.org .
**Hvis du får en python-feilmelding som denne
AttributeError: 'str' object has no attribute 'some_method'
Du har sannsynligvis forgiftet objektet ditt ved et uhell ved å overskrive objektet med en streng.
Slik reproduserer du denne feilen i python med noen få kodelinjer: .
#!/usr/bin/env python
import json
def foobar(json):
msg = json.loads(json)
foobar('{"batman": "yes"}')
Kjør den, som skriver ut: {{}}}.
AttributeError: 'str' object has no attribute 'loads'
Men endre navnet på variablenavnet, og det fungerer fint:
#!/usr/bin/env python
import json
def foobar(jsonstring):
msg = json.loads(jsonstring)
foobar('{"batman": "yes"}')
Denne feilen skyldes at du har forsøkt å kjøre en metode i en streng. String har noen få metoder, men ikke den du påkaller. Så slutt å prøve å påkalle en metode som String ikke definerer, og begynn å lete etter hvor du har forgiftet objektet ditt.