recursion in Class-methods?

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Jun 26 11:06:07 CEST 2008


klant a écrit :
> do i need to call Graph.find_path?
 >
> 
>>>> g = Graph({'A': ['B', 'C'],
>              'B': ['C', 'D'],
>              'C': ['D'],
>              'D': ['C'],
>              'E': ['F'],
>              'F': ['C']})
>>>> g
> <__main__.Graph instance at 0x01D74378>
>>>> g.find_all_paths('A', 'C')
> 
> Traceback (most recent call last):
>   File "<pyshell#10>", line 1, in <module>
>     g.find_all_paths('A', 'C')
>   File "C:/Python25/Progs/pygameProgs/visualgraph/graph.py", line 26,
> in find_all_paths
>     newpaths = find_all_paths(self.dictionary, node, end, path)
> NameError: global name 'find_all_paths' is not defined
>>>> g.find_path('A', 'C')
> 
> Traceback (most recent call last):
>   File "<pyshell#11>", line 1, in <module>
>     g.find_path('A', 'C')
>   File "C:/Python25/Progs/pygameProgs/visualgraph/graph.py", line 13,
> in find_path
>     newpath = find_path(self.dictionary, node, end, path)
> NameError: global name 'find_path' is not defined
 >
> 
> 
> 
> class Graph:

Unless you need to ensure compat with ages-old Python versions, better 
to use newstyle classes:

class Graph(object):

>     def __init__(self, dictionary):
>         self.dictionary = dictionary
> 
>     def find_path(self, start, end, path=[]):

http://effbot.org/pyfaq/why-are-default-values-shared-between-objects.htm

Unless you exactly what you're doing (and given your current problem, I 
can tell it's not the case), *don't* use mutable containers as default 
function argument values.


      def find_path(self, start, end, path=None):
          if path is None:
              path = []

>         path = path + [start]

           path.append(start)

>         if start == end:
>             return path
>         if not self.dictionary.has_key(start):

           if start not in self.dictionnary:

>             return None


>         for node in self.dictionary[start]:
>             if node not in path:
>                 newpath = find_path(self.dictionary, node, end, path)

                   newpath = self.find_path(...)





(snip remaining code - same problems, same solutions...)



More information about the Python-list mailing list