[Python-Dev] Dataclasses and correct hashability

Glenn Linderman v+python at g.nevcal.com
Mon Feb 5 03:54:49 EST 2018


On 2/5/2018 12:11 AM, Nathaniel Smith wrote:
> On Sun, Feb 4, 2018 at 11:28 PM, Glenn Linderman <v+python at g.nevcal.com> 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. 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?
> It would be technically possible to support something like
>
> @dataclass(freezable=True)
> class Foo:
>      blah: int
>
> foo = Foo()
> # Initially, object is mutable, and hash(foo) raises an error
> foo.blah = 1
> assertRaises(hash, foo)
>
> # This method is automatically generated for classes with freezable=True
> foo.freeze()
>
> # Now object is immutable, and hash(foo) is allowed
> assertRaises(foo.__setattr__, "blah", 2)
> hash(foo)
>
> I don't know if it's worth the complexity, but I guess it would cover
> at least some of the use cases Guido raised.
>
> -n
>
Thanks, Nathaniel, for confirming that what I was suggesting is not 
impossible, even if it turns out to be undesirable for some reason, or 
unwanted by anyone else. But I have encountered a subset of the use 
cases Guido mentioned, and had to make a 2nd class to gather/hold the 
values of the eventual immutable class, before I could make it, because 
pieces of the data for the class values were obtained from different 
sources at different times. Once all collected, then the immutability 
could be obtained, the rest of the processing performed. Thrashes the 
allocator pretty well doing it that way, but the job got done.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20180205/4feb9e3d/attachment.html>


More information about the Python-Dev mailing list