2

既存のシェルフからキーと値のペアを読み取って、更新されたフィールドを持つ新しいクラス オブジェクトを作成し、そのクラス オブジェクトを新しいシェルフに書き込もうとしています。私のクラスオブジェクト:SongDetails

これは失敗する手順です:

def updateShelfWithTabBody(shelfFileName, newShelfFileName):
     """this function updates songDetails with
     html body i.e. just the part that contains lyrics and
     chords in the tab """

 #read all songDetails
 shelf = shelve.open(shelfFileName)
 listOfKeys = shelf.keys()
 #create new songDetails object
 temporaryShelfObject = SongDetails.SongDetails()

 #iterate over list of keys
 for key in listOfKeys:
     #print "name:"+shelf[key].name
     #fill details from temporaryShelfObject
     temporaryShelfObject.name = shelf[key].name
     temporaryShelfObject.tabHtmlPageContent = shelf[key].tabHtmlPageContent
     #add new detail information
     htmlPageContent = shelf[key].tabHtmlPageContent
     temporaryShelfObject.htmlBodyContent = extractDataFromDocument.fetchTabBody(htmlPageContent)
     #write SongDetails back to shelf
     writeSongDetails.writeSongDetails(temporaryShelfObject, newShelfFileName)

上記のコードで使用される関数の定義:

def fetchTabBody(page_contents):
    soup = BeautifulSoup(page_contents)
    HtmlBody = ""
    try:
            #The lyrics and chords of song are contained in div with id = "cont"
            #Note: This assumtption is specific to ultimate-guitar.com
            HtmlBody = soup.html.body.find("div",{"id":"cont"})
    except:
            print "Error: ",sys.exc_info()[0]
    return HtmlBody

def writeSongDetails(songDetails, shelfFileName):
    shelf = shelve.open(shelfFileName)
    songDetails.name = str(songDetails.name).strip(' ')
    shelf[songDetails.name] = songDetails
    shelf.close()

SongDetails クラス:

class SongDetails:
    name = ""
    tabHtmlPageContent = ""
    genre = ""
    year = ""
    artist = ""
    chordsAndLyrics = ""
    htmlBodyContent = ""
    scale = ""
    chordsUsed = []

これは私が得るエラーです:

Traceback (most recent call last):
File "/l/nx/user/ndhande/Independent_Study_Project_Git/Crawler/updateSongDetailsShelfWithNewAttributes.py", line 69, in <module>
updateShelfWithTabBody(shelfFileName, newShelfFileName)
File "/l/nx/user/ndhande/Independent_Study_Project_Git/Crawler/updateSongDetailsShelfWithNewAttributes.py", line 38, in updateShelfWithTabBody
writeSongDetails.writeSongDetails(temporaryShelfObject, newShelfFileName)
File "/home/nx/user/ndhande/Independent_Study_Project_Git/Crawler/writeSongDetails.py", line 7, in writeSongDetails
shelf[songDetails.name] = songDetails
File "/usr/lib64/python2.6/shelve.py", line 132, in __setitem__
p.dump(value)
File "/usr/lib64/python2.6/copy_reg.py", line 71, in _reduce_ex
state = base(self)
File "/u/ndhande/.local/lib/python2.6/site-packages/BeautifulSoup.py", line 476, in __unicode__
return str(self).decode(DEFAULT_OUTPUT_ENCODING)
**RuntimeError: maximum recursion depth exceeded**

コードに明示的な再帰呼び出しがないにもかかわらず、このエラーが発生する理由が見つかりませんでした。他のスタックオーバーフローの投稿でこのエラーを見たことがありますが、その場合は再帰呼び出しがありました。

4

1 に答える 1

0

str(self)コール__str__またはコール__unicode__コールstr(self)

于 2013-09-10T11:35:43.233 に答える