Made some improvements to the pyan.py script -- it now creates distinct nodes for each object encountered, e.g. Message.send and Socket.send are no longer considered the same thing. It tries to infer which is being used in each particular instance; if it can't do that, it will add use-edges to every possible match. E.g.: x = Message(); x.send() is clearly a reference to Message.send. This is all very heuristical; so can't be relied upon as proper static analysis. But it cleans up the call graphs quite a bit.
Some outstanding mis-guesses exist.