0

このエラーはランダムに表示されます。これは、return ステートメントが呼び出す前に infoGotten 変数が初期化されていないことが原因であると確信しています。私が困惑した部分は、コードのその部分に到達して最初にそのエラーを生成する方法です。うまくいけば、私はまだそれを理解することができなかったので、それがなぜなのかを誰かが説明してくれることを願っています. try/except ステートメントが原因だと推測していますが、マニュアルで 7.4 を検索して確認しましたが、(とにかく) 何か間違ったことをしているようには見えません。

breakLoop = 0
def get_item_info(linkParameters):
    global breakLoop
    nheaders = {'User-Agent' : 'Firefox/15.0.1'}
    purl = 'http://example.com/something.php'
    pd = linkParameters
    nreq = urllib.request.Request(purl, pd, nheaders)
    if breakLoop >= 4:
        return 'Request timed out {} times'.format(breakLoop)
    try:
        nresponse = urllib.request.urlopen(nreq)
    except urllib.error.URLError:
        breakLoop += 1
        get_item_info(pd)
    except urllib.error.HTTPError:
        breakLoop += 1
        get_item_info(pd)        
    else:
        infoGotten = nresponse.read()
    return infoGotten

ありがとう!

4

1 に答える 1

3

再帰呼び出しの結果を返す必要があるためreturn get_item_info(pd)except句に含める必要があります(以下にまとめました):

breakLoop = 0
def get_item_info(linkParameters):
    nheaders = {'User-Agent' : 'Firefox/15.0.1'}
    purl = 'http://example.com/something.php'
    pd = linkParameters
    nreq = urllib.request.Request(purl, pd, nheaders)
    if breakLoop >= 4:
        return 'Request timed out {} times'.format(breakLoop)
    try:
        nresponse = urllib.request.urlopen(nreq)
    except (urllib.error.URLError, urllib.error.HTTPError):
        breakLoop += 1
        return get_item_info(pd)
    else:   
        return nresponse.read()

再帰は再試行を実行するための奇妙な方法のように思えますが、ループを使用しないのはなぜですか? 以下はより明確に見えます:

def get_item_info(linkParameters):
    nheaders = {'User-Agent' : 'Firefox/15.0.1'}
    purl = 'http://example.com/something.php'
    pd = linkParameters
    for i in range(5):
        nreq = urllib.request.Request(purl, pd, nheaders)
        try:
            nresponse = urllib.request.urlopen(nreq)
            return nresponse.read()
        except (urllib.error.URLError, urllib.error.HTTPError):
            pass
    return 'Request timed out 4 times'
于 2012-09-28T17:13:41.630 に答える