Changed implementation of WeightedRips to store simplex values (max distance between simplices' vertices) as an invisible layer on top of each simplex object, so that the data() field of WeightedRips has been freed for use by the users again.
from    math        import sqrt
def l2(p):
    return sqrt(                                        # take the square root
            reduce(lambda x, y: x + y,                  # add them all up
                   map(lambda x: x**2, p)))             # square each coordinate
# Pairwise distances between the elements of `points` with respect to some `norm`
class PairwiseDistances:
    def __init__(self, points, norm = l2):
        self.points = points
        self.norm = norm
    def __len__(self):
        return len(self.points)
    def __call__(self, p1, p2):
        return self.norm((x - y for (x,y) in zip(self.points[p1], self.points[p2])))
# Caches all distances specified by `distances`
class ExplicitDistances:
    def __init__(self, distances):
        self.len = len(distances)
        self.distances = []
        for i in xrange(self.len): 
            self.distances.append([])
            for j in xrange(self.len):
                self.distances[-1].append(distances(i,j))
    def __len__(self):
        return self.len
    def __call__(self, p1, p2):
        return self.distances[p1][p2]
# Generator of all points in a file `filename` with one point per line
def points_file(filename):
    fd = open(filename)
    for line in fd.xreadlines():
        yield map(float, line.strip().split())
    fd.close()