0

次の関数を実行すると:

def checkChange():
    for user in userLinks:
        url = userLinks[user]
        response = urllib2.urlopen(url)  
        html = response.read()

私は得る

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

これは私には意味がありません。グローバル変数応答がありません。通常、以下のように動作することを期待しています。

>>> url="http://google.com"
>>> response = urllib2.urlopen(url)  
>>> html = response.read()
>>> html
'<!doctype html>

このエラーが発生する理由を知っている人はいますか?

4

2 に答える 2

1

コードが適切にインデントされていません。これを次のように変更すると機能します (おそらく意図したとおりではありませんが、機能します)。

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!')

responseループ内で定義したためにエラーが発生しますforが、ループが実行されない場合 (つまりuserLinks == [])、その変数は設定されません。

于 2013-01-12T03:35:37.187 に答える
1

タブとスペースが混在しています。貼り付けた生のコードを見ると、次のようになります。

'    def checkChange():'
'    \tfor user in userLinks:'
'    \t\turl = userLinks[user]'
'    \t\tresponse = urllib2.urlopen(url)  '
'            html = response.read()'

最後の行にスイッチが表示されます。事実上、これは、html = response.read()行が思ったほどインデントされていないことを意味します。つまり、userLinksが空の場合、次のようになります。

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

これを確認するためにコードを実行python -tt yourprogramname.pyし、常に 4 つのスペース タブを使用するように切り替えます。

于 2013-01-12T03:36:25.823 に答える