Skip to content

Commit 9a97abc

Browse files
committed
Prevent iterating over a TopologyCounter
1 parent e81ee40 commit 9a97abc

File tree

3 files changed

+14
-0
lines changed

3 files changed

+14
-0
lines changed

python/CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
and a window breakpoint falls within an internal missing interval.
1717
(:user:`nspope`, :pr:`3176`, :issue:`3175`)
1818

19+
- Prevent iterating over a ``TopologyCounter``
20+
(:user:`benjeffery` , :pr:`XXXX`, :issue:`1462`)
21+
1922
--------------------
2023
[0.6.4] - 2025-05-21
2124
--------------------

python/tests/test_combinatorics.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,11 @@ def verify_topologies(self, ts, sample_sets=None, expected=None):
635635
assert actual_topologies == expected[i][sample_set_indexes]
636636
assert actual_topologies == actual_inc_topologies
637637

638+
def test_no_iterate(self):
639+
with pytest.raises(TypeError, match="not iterable"):
640+
for _ in tskit.Tree.generate_star(3).count_topologies():
641+
pass
642+
638643
def subsample_topologies(self, ts, sample_sets, sample_set_indexes):
639644
subsample_sets = [sample_sets[i] for i in sample_set_indexes]
640645
topologies = collections.Counter()

python/tskit/combinatorics.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,12 @@ def __setitem__(self, sample_set_indexes, counter):
541541
k = TopologyCounter._to_key(sample_set_indexes)
542542
self.topologies[k] = counter
543543

544+
def __iter__(self):
545+
raise TypeError(
546+
"TopologyCounter object is not iterable, "
547+
"iterate over '.topologies' instead"
548+
)
549+
544550
@staticmethod
545551
def _to_key(sample_set_indexes):
546552
if not isinstance(sample_set_indexes, collections.abc.Iterable):

0 commit comments

Comments
 (0)