/ / Python - Weird UnboundLocalError - python

Python - Weird UnboundLocalError - python

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 № 1

Zmieniasz 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.