import collections from typing import Iterable from unittest import TestCase class Node(collections.UserList): owner: None = None class Leaf(Node): pass class Tree(Node): def __init__(self, seq: Iterable[Node] = None): if seq is None: seq = [] for node in seq: node.owner = self super(Tree, self).__init__(seq) def __setitem__(self, key, value): if type(key) is int: self[key].pred = None value.pred = self else: # slice for old, new in zip(self[key], value): old.owner = None new.owner = self return super(Tree, self).__setitem__(key, value) class TestTree(TestCase): def test___setitem__(self): ls = [Leaf([n]) for n in range(6)] # ls = [[0], [1], [2], ..., [5]] d = Tree(ls[:4]) # d = [[0], [1], [2], [3]] d[0:2] = ls[4:6] # d = [[4], [5], [2], [3]] self.assertListEqual([d, d], [ls[4].owner, ls[5].owner]) # pass print(d[0].owner) # [[4], [5], [2], [3]] _ = d[0:1] print(d[0].owner) # [[4]] ??? print(d[1].owner) # [[4], [5], [2], [3]] _ = d[0:2] print(d[0].owner) # [[4], [5]] ??? print(d[1].owner) # [[4], [5]] ??? print(d[0].owner == d[0:1]) # False self.assertEqual(d[0:1], d[0].owner) # pass ??? self.assertEqual(d[0:2], d[0].owner) # pass ???