Passing Functions

alex23 wuwei23 at gmail.com
Thu Mar 10 20:48:09 EST 2011


On Mar 11, 11:13 am, yoro <gmj... at hotmail.co.uk> wrote:
> Hi,
>
> I am having an issue with passing values from one function to another
> - I am trying to fill a list in one function using the values
> contained in other functions as seen below:
>
> infinity = 1000000
> invalid_node = -1
> startNode = 0
>
> #Values to assign to each node
> class Node:
>      distFromSource = infinity
>      previous = invalid_node
>      visited = False
>
> #read in all network nodes
> def network():
>     f = open ('network.txt', 'r')
>     theNetwork = [[int(node) for node in line.split(',')] for line in
> f.readlines()]
>     print theNetwork
>
>     return theNetwork
>
> #for each node assign default values
> def populateNodeTable():
>     nodeTable = []
>     index = 0
>     f = open('network.txt', 'r')
>     for line in f:
>       node = map(int, line.split(','))
>       nodeTable.append(Node())
>
>       print "The previous node is " ,nodeTable[index].previous
>       print "The distance from source is
> " ,nodeTable[index].distFromSource
>       index +=1
>     nodeTable[startNode].distFromSource = 0
>
>     return nodeTable
>
> #find the nearest neighbour to a particular node
> def nearestNeighbour(currentNode, theNetwork):
>      nearestNeighbour = []
>      nodeIndex = 0
>      for node in nodeTable:
>           if node != 0 and currentNode.visited == false:
>              nearestNeighbour.append(nodeIndex)
>              nodeIndex +=1
>
>      return nearestNeighbour
>
> if __name__ == "__main__":
>     nodeTable = populateNodeTable()
>     theNetwork = network()
>     nearestNeighbour(currentNode, theNetwork, )
>
> So, I am trying to look at the values provided by the network
> function,  set all nodes to 'visited = false' in populateNodeTable
> function and then determine the nodes' nearest neighbour by looking at
> the values provided in the previous function, though I get this error
> message:
>
> if node != 0 and currentNode.visited == false:
> AttributeError: 'int' object has no attribute 'visited'
>
> I'm not sure what to try next

Well, for starters, you're not actually instantiating any Nodes:

> theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]

You're returning a list of integers, none of which have the visited
attribute.

At the very least, you need a constructor on your Node class:

class Node:
  def __init__(self, distFromSource=infinity, previous=invalid_node,
visited=False):
    self.distFromSource = distFromSource
    self.previous = previous
    self.visited = False

Now, I'm _assuming_ your network.txt file consists of 3 number
separated by commas, so in network() it should probably be something
like:

def network():
  with open('network.txt', 'r') as f:
    network_data = ([int(node) for node in line.split(',')] for line
in f.readlines())
    theNetwork = [Node(*data) for data in network_data]
  return theNetwork

The with statement ensures the file is closed at the end of the block.
'network_data' is a generator that reads each line and splits it into
a list of ints: '[x, y, z]'
'Node(*data)' takes a list of ints and creates a node from those
values.

Since both populateNodeTable and nearestNeighbour relay on nodeTable,
you might be better off making a NodeTable class.

None of this is tested, sorry, but hopefully it'll set you in the
right direction.



More information about the Python-list mailing list