On 2/5/2018 2:28 AM, Glenn Linderman wrote:

This is an interesting use case. I haven't got the internals knowledge to know just how just different mutable and immutable classes and objects are under the hood.

I believe there is no internal difference. An object is immutable if there is not way to mutate it with Python code that not poke into internals, such as one can do with ctypes or 3rd party extensions. Numbers and strings have no mutation methods, including no .__init__.

A tuple is a fixed sequence of objects and has no .__init__. But if any object in a tuple is mutable, then the tuple is. But the tuple does not know its status, and there is no 'is_mutable' function. However, tuple.__hash__ calls the .__hash__ method of each object and if that is missing for one, tuple.__hash raises.

>>> hash((1, 'a', []))
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    hash((1, 'a', []))
TypeError: unhashable type: 'list'

The built-in immutable objects are mutated from their initial blank values in the C code of their .__new__ methods. So they are only 'immutable' once constructed. Guido pointed out that users constructing objects in Python code might reasonably do so other than only with .__new__, but still want to treat the object as immutable once constructed.

In Lisp, for instance, lists are actually trees. To be immutable, they can only be singly linked and must be constructed from leaf nodes to the root (or head). Python programmers should be able to link in both directions and start from the root, and still treat the result as frozen and hashable.

But this use case makes me wonder if, even at the cost of some performance that "normal" immutable classes and objects might obtain, if it would be possible to use the various undisciplined initialization patterns as desired, followed by as declaration "This OBJECT is now immutable" which would calculate its HASH value, and prevent future mutations of the object?

Something like this has been proposed, at least for dicts, and rejected.

--
Terry Jan Reedy

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to