コード例 #1
0
 def test_remove(self):
     s = ElementTransformSet(transform=lambda x: x*x)
     with self.assertRaises(KeyError) as cm:
         s.remove(3)
     # Make sure that the KeyError carries the original value,
     # not the transformed value.
     self.assertEqual(cm.exception.args, (3,))
コード例 #2
0
 def test_discard(self):
     s = ElementTransformSet(transform=lambda x: x*x)
     s.add(13)
     s.add(-14)
     # Discarding something in the set.
     s.discard(-13)
     self.assertIn(14, s)
     self.assertNotIn(13, s)
     # Discarding something not in the set.
     s.discard(17)
コード例 #3
0
 def test_len(self):
     s = ElementTransformSet(transform=lambda x: x*x + 1)
     self.assertEqual(len(s), 0)
     s.add(4)
     self.assertEqual(len(s), 1)
     s.add(5)
     self.assertEqual(len(s), 2)
     s.remove(-4)
     self.assertEqual(len(s), 1)
     s.remove(-5)
     self.assertEqual(len(s), 0)
コード例 #4
0
    def _from_objects(cls, objects):
        """
        Private constructor: create graph from the given Python objects.

        The constructor examines the referents of each given object to build up
        a graph showing the objects and their links.

        """
        vertices = ElementTransformSet(transform=id)
        out_edges = KeyTransformDict(transform=id)
        in_edges = KeyTransformDict(transform=id)
        for obj in objects:
            vertices.add(obj)
            out_edges[obj] = []
            in_edges[obj] = []

        # Edges are identified by simple integers, so
        # we can use plain dictionaries for mapping
        # edges to their heads and tails.
        edge_label = itertools.count()
        edges = set()
        head = {}
        tail = {}

        for referrer in vertices:
            for referent in gc.get_referents(referrer):
                if referent not in vertices:
                    continue
                edge = next(edge_label)
                edges.add(edge)
                tail[edge] = referrer
                head[edge] = referent
                out_edges[referrer].append(edge)
                in_edges[referent].append(edge)

        return cls._raw(
            vertices=vertices,
            edges=edges,
            out_edges=out_edges,
            in_edges=in_edges,
            head=head,
            tail=tail,
        )
コード例 #5
0
    def full_subgraph(self, objects):
        """
        Return the subgraph of this graph whose vertices
        are the given ones and whose edges are the edges
        of the original graph between those vertices.

        """
        vertices = ElementTransformSet(transform=id)
        out_edges = KeyTransformDict(transform=id)
        in_edges = KeyTransformDict(transform=id)
        for obj in objects:
            vertices.add(obj)
            out_edges[obj] = []
            in_edges[obj] = []

        edges = set()
        head = {}
        tail = {}

        for referrer in vertices:
            for edge in self._out_edges[referrer]:
                referent = self._head[edge]
                if referent not in vertices:
                    continue
                edges.add(edge)
                tail[edge] = referrer
                head[edge] = referent
                out_edges[referrer].append(edge)
                in_edges[referent].append(edge)

        return ObjectGraph._raw(
            vertices=vertices,
            edges=edges,
            out_edges=out_edges,
            in_edges=in_edges,
            head=head,
            tail=tail,
        )
コード例 #6
0
 def test_bool(self):
     s = ElementTransformSet(transform=abs)
     self.assertFalse(s)
     s.add(23)
     self.assertTrue(s)
コード例 #7
0
 def test_update(self):
     s = ElementTransformSet(transform=lambda x: x*x + 1)
     s.update([5, 6, 7])
     self.assertEqual(sorted(s), [5, 6, 7])
     s.update([1, 2, 3])
     self.assertEqual(sorted(s), [1, 2, 3, 5, 6, 7])
コード例 #8
0
 def test_iter(self):
     s = ElementTransformSet(transform=lambda x: x*x + 1)
     s.add(4)
     s.add(5)
     self.assertEqual(sorted(iter(s)), [4, 5])
コード例 #9
0
 def test_first_addition_takes_precedence(self):
     # Like a normal set.
     s = ElementTransformSet(transform=abs)
     s.add(23)
     s.add(-23)
     self.assertEqual(list(s), [23])
コード例 #10
0
 def test_add_and_in(self):
     s = ElementTransformSet(transform=lambda x: x*x)
     s.add(13)
     self.assertIn(13, s)
コード例 #11
0
 def test_add_and_len(self):
     s = ElementTransformSet(transform=abs)
     self.assertEqual(len(s), 0)
     s.add(2)
     self.assertEqual(len(s), 1)