RuntimeError: se excedió la profundidad máxima de recursividad (sin una llamada recursiva explícita en mi código de Python)

I am trying to read key-value pairs from an already existing shelf to create a new class object with a updated field and write that class object to a new shelf. My class object : SongDetails

This is the procedure which fails:

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)

Definitions for functions used in above code:

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:

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

Este es el error que obtengo:

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**

I couldn't find any reason why I'm getting this error even though there is no explicit recursive call in my code. I have seen this error in other stackoverflow posts, but they did have recursive calls in their case.

preguntado el 09 de septiembre de 13 a las 22:09

Que es songDetails? -

Oops, sorry missed that detail. It's a class, edited my original post to include its definition. -

to check whether it is a bug in BeautifulSoup, you could install a newer version: run pip install --user beautifulsoup4 y use from bs4 import BeautifulSoup en su código. -

1 Respuestas

str(self) llamadas __str__ o llamadas __unicode__ llamadas str(self).

Respondido el 10 de Septiembre de 13 a las 12:09

My code works when I change the return statement in method "fetchTabBody()" from "return HtmlBody" to "return str(HtmlBody)". I assume this avoids the decoding of unicode text while storing it in shelf and prevents recursive calls as in case of "Unicode calls str(self)" as mentioned in accepted answer. - nakul225

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.