On Sat, Jun 6, 2015 at 2:50 PM, Steven D'Aprano <st...@pearwood.info> wrote: > This does not happen: > > mylist = [] > mytuple = (None, 1, mylist) > mylist.append(0) > => raises an exception > > The *tuple* is immutable, not the list.
What you could have is a "FrozenList" (by analogy with frozenset), something like this: class FrozenList(tuple): def __new__(*a, **kw): self = tuple.__new__(*a, **kw) hash(self) # If error, disallow construction return self That would raise the error at the moment of mytuple's creation, not at mylist's mutation, but that's about as close as I can think of to a "this truly must be immutable" object in Python. And of course, any object can lie (or be mistaken) about its hashability and mutability: >>> def adder(x, inc=1): return x+inc ... >>> hash(adder) -9223363254790714706 >>> FrozenList((adder,)) (<function adder at 0x7fcbbcf0aae8>,) >>> descr = {adder: "Add 1 to a number"} Looks immutable to me. >>> adder.__defaults__=2, >>> next(iter(descr))(6) 8 Oops. ChrisA -- https://mail.python.org/mailman/listinfo/python-list