Moving from java to python.

Paul Hankin paul.hankin at gmail.com
Mon Nov 12 10:42:47 EST 2007


On Nov 12, 3:25 pm, "PeterBrad... at googlemail.com"
<PeterBrad... at googlemail.com> wrote:
> Hi,
>
> I have recently been learning python, and coming from a java
> background there are many new ways of doing things that I am only just
> getting to grips with.
>
> I wondered if anyone could take a look at a few pieces of code I have
> written to see if there are any places where I am still using java-
> esque techniques, and letting me know the appropriate python way of
> doing things.
>
> Here is a node class I wrote for use in graph traversal algorithms:
>
> #====
>
> class Node:
>         """
>         Node models a single piece of connected data.
>
>         Author: Peter Braden
>         Last Modified : Nov. '07
>         """
>
>         def __init__(self, connections = None, uid = None):
>                 """
>                 Args:
>                         [connections - a list of (connected node, weight) tuples.       ]
>                         [uid - an identifier for comparisons.]
>                 """
>                 self._connected = []
>                 self._weights = []
>
>                 if connections:
>                         for i in connections:
>                                 self.connected.append(i[0])
>                                 self.weights.append(i[1])
>
>                 if not uid:
>                         self.id = id(self)
>                 else:
>                         self.id = uid
>
>         def __eq__(self, other):
>                 return self.id == other.id
>
>         def getConnected(self):
>                 return self._connected
>
>         def getWeights(self):
>                 return self._weights
>
>         def getConnections(self):
>                 connections = []
>                 for i in range(len(connected)):
>                         connections.append((self._connected[i],self._weight[i]))
>                 return connections
>
>         connected = property(getConnected, None)
>         weights = property (getWeights, None)
>         connections = property(getConnections, None)
>
>         def addConnection(self, node, weight = 0):
>                 self.connected.append(node)
>                 self.weights.append(weight)
>
>         def removeConnection(self, node):
>                 i = self._connected.index(node)
>                 del self._connected[i]
>                 del self._weights[i]

There's no reason to make 'connected' and 'weights' properties: just
use them directly.

Make 'connections' default to [] rather than None, and replace the
slightly clumsy initialisation with more direct code:

self.connected = [i[0] for i in connections]
self.weights = [i[1] for i in connections]

getConnections can be much simpler...

def getConnections(self):
    return zip(self.connected, self.weights)

The 'uid' business makes me suspicious: what's it for? If you need it,
you probably need to initialise with an explicit test for None rather
than just 'if uid' which will be wrong if you use a uid of 0...

self.id = uid if uid is not None else id(self)

HTH
--
Paul Hankin




More information about the Python-list mailing list