Skip to content

Commit 220f1fd

Browse files
committed
Make graphlib.TopologicalSorter.prepare() idempotent
Fixes #130914
1 parent 80b9e79 commit 220f1fd

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

Lib/graphlib.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ def prepare(self):
9292
therefore no more nodes can be added using "add".
9393
"""
9494
if self._ready_nodes is not None:
95-
raise ValueError("cannot prepare() more than once")
95+
if self._npassedout > 0:
96+
raise ValueError("cannot prepare() after starting sort")
97+
return
9698

9799
self._ready_nodes = [
98100
i.node for i in self._node2info.values() if i.npredecessors == 0

Lib/test/test_graphlib.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,13 @@ def test_calls_before_prepare(self):
140140
def test_prepare_multiple_times(self):
141141
ts = graphlib.TopologicalSorter()
142142
ts.prepare()
143-
with self.assertRaisesRegex(ValueError, r"cannot prepare\(\) more than once"):
143+
ts.prepare()
144+
145+
def test_prepare_after_pass_out(self):
146+
ts = graphlib.TopologicalSorter({'a': 'bc'})
147+
ts.prepare()
148+
self.assertEqual(set(ts.get_ready()), {'b', 'c'})
149+
with self.assertRaisesRegex(ValueError, r"cannot prepare\(\) after starting sort"):
144150
ts.prepare()
145151

146152
def test_invalid_nodes_in_done(self):

0 commit comments

Comments
 (0)