Gdy uruchomię następującą funkcję:
def checkChange():
for user in userLinks:
url = userLinks[user]
response = urllib2.urlopen(url)
html = response.read()
dostaję
Traceback (most recent call last):
File "InStockBot.py", line 34, in <module>
checkChange()
File "InStockBot.py", line 24, in checkChange
html = response.read()
UnboundLocalError: local variable "response" referenced before assignment
Co nie ma dla mnie sensu. Nie mam globalnej odpowiedzi var. Spodziewam się, że działa normalnie jak poniżej.
>>> url="http://google.com"
>>> response = urllib2.urlopen(url)
>>> html = response.read()
>>> html
"<!doctype html>
Ktoś wie, dlaczego dostaję ten błąd?
Odpowiedzi:
1 dla odpowiedzi № 1Zmieniasz tabulatory i spacje. Patrząc na surowy kod, który wkleiłeś:
" def checkChange():"
" tfor user in userLinks:"
" tturl = userLinks[user]"
" ttresponse = urllib2.urlopen(url) "
" html = response.read()"
Możesz zobaczyć przełącznik w ostatnim wierszu. Skutecznie oznacza to, że html = response.read()
linia nie jest wcięta tak daleko jak myślisz, co oznacza, że jeśli userLinks
jest pusty, dostaniesz:
Traceback (most recent call last):
File "inde.py", line 10, in <module>
checkChange()
File "inde.py", line 5, in checkChange
html = response.read()
UnboundLocalError: local variable "response" referenced before assignment
Uruchom swój kod za pomocą python -tt yourprogramname.py
aby to potwierdzić i przełącz się na zawsze za pomocą czterech spacji.
1 dla odpowiedzi nr 2
Twój kod nie został poprawnie wcięty. Zmień go na ten i będzie działał (prawdopodobnie nie zgodnie z przeznaczeniem, ale zadziała):
for user in userLinks:
url = userLinks[user]
response = urllib2.urlopen(url)
html = response.read()
if userSources[user] != html:
del userSources[user]
del userLinks[user]
api.PostDirectMessage(user,"It appears the page has updated! Your item may be back in stock!")
Błąd występuje, ponieważ definiujesz response
w for
pętli, ale jeśli pętla nie działa (tj. userLinks == []
), ta zmienna nigdy nie jest ustawiona.