object-freezer
Python module for freezing objects.
Installation
$ pip install object-freezer
Then import this module as:
import object_freezer as of
Examples
A list is frozen into a tuple:
>>> l = [1, 2, 3]
>>> hash(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> fl = of.freeze(l)
>>> hash(fl)
2528502973977326415
>>> fl
(1, 2, 3)
A dictionary is frozen into a deepfrozendict
instance:
>>> import object_freezer as of
>>> d = {'a': 'A', 'b': 'B'}
>>> hash(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> fd = of.freeze(d)
>>> hash(fd)
3871628092596788623
>>> fd
<deepfrozendict {'a': 'A', 'b': 'B'}>
If an element of a list is not hashable, it will also be frozen:
>>> l = [[1, 2], {3: 4}]
>>> hash(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> fl = of.freeze(l)
>>> hash(fl)
5879964472677921951
>>> fl
((1, 2), <deepfrozendict {3: 4}>)
If a value of a dictionary is not hashable, it will be frozen:
>>> import object_freezer as of
>>> d = {'a': ['A', 0], 'b': {'B': 1}}
>>> hash(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> fd = of.freeze(d)
>>> hash(fd)
6230706721132225338
>>> fd
<deepfrozendict {'a': ('A', 0), 'b': <deepfrozendict {'B': 1}>}>
Known issues & notes
dict
with one (key, value)
pair has the same hash value as a tuple (key, value)
A Since a list is frozen into a tuple, it is obvious that of.freeze([key, value])
and of.freeze((key, value))
are the same and thus have the same hash value. However, of.freeze({key: value})
also always has the same hash value.
>>> d = {1: 2}
>>> t = (1, 2)
>>> fd = of.freeze(d)
>>> ft = of.freeze(t)
>>> hash(fd) == hash(ft)
True
It is not a major issue since fd == ft
returns False
. Therefore, for example, you can use fd
and ft
as a distinct dictionary keys.
>>> fd == ft
False
>>> {fd: 0, ft: 1}
{<deepfrozendict {1: 2}>: 0, (1, 2): 1}
License
TO-DO's
- Test against various Python versions.