Function returns none

Carsten Haese carsten at uniqsys.com
Mon Oct 31 14:29:08 EST 2005


On Mon, 2005-10-31 at 14:12, noahlt at gmail.com wrote:
> I'm trying to write a website updating script, but when I run the
> script, my function to search the DOM tree returns None instead of what
> it should.
> 
> I have this program:
> --------
> import sys
> from xml.dom.minidom import parse
> 
> 
> # search the tree for an element with a particular class
> 
> def findelement(current, classtofind, topnode = None):
>     if topnode == None: topnode = current
> 
> 
> 
>     # if it's an xml element...
>     if current.nodeType == 1:
>         print current.nodeName, ':', current.getAttribute('class')
>         if current.getAttribute('class') == classtofind:
>             print 'Returning node:', current
>             return current
>         elif current.hasChildNodes():
>             findelement(current.firstChild, classtofind, topnode)
>         elif current.nextSibling:
>             findelement(current.nextSibling, classtofind, topnode)
> 
>         elif (current.parentNode != topnode) \
> 
>                  and (current.parentNode.nextSibling != None):
> 
>             findelement(current.parentNode.nextSibling, classtofind,
> topnode)
>         else:
> 
>             print 'Returning None...'
> 
>             return None
> 
>     # others (text, comment, etc)
> 
>     else:
> 
>         if current.nextSibling:
> 
>             findelement(current.nextSibling, classtofind, topnode)
> 
>         elif (current.parentNode != topnode) \
> 
>                  and (current.parentNode.nextSibling != None):
> 
>             findelement(current.parentNode.nextSibling, classtofind,
> topnode)
>         else:
> 
>             print 'Returning None...'
> 
>             return None
> 
> 
> 
> # parse the document
> 
> blog = parse('/home/noah/dev/blog/template.html')
> 
> 
> 
> # find a post
> 
> postexample = findelement(blog.documentElement, 'post')
> 
> 
> 
> print 'Got node:       ', postexample
> 
> -----
> 
> My output is this:
> 
> -----
> html :
> head :
> title :
> body :
> h1 :
> ul :
> li :
> h2 :
> ol :
> li : post
> Returning node: <DOM Element: li at -0x48599c74>
> Got node:        None
> -----
> 
> The function finds the right element fine, and says it will return <DOM
> Element: li at -0x48599c74>, but the program gets None instead.  What's
> happening here?  Any suggestions?

You have a lot of cases where findelement is called recursively and then
its return value is discarded instead of being turned into a return
value to the caller. In those cases, execution simply falls off the end
of the function and None is returned implicitly (and silently, since you
don't have a print "Returning None" at the end of the function).

HTH,

Carsten.





More information about the Python-list mailing list