# frozendict
### Table of Contents
* [Introduction](#introduction)
* [Install](#install)
* [API](#api)
* [frozendict API](#frozendict-api)
* [deepfreeze API](#deepfreeze-api)
* [Examples](#examples)
* [frozendict examples](#frozendict-examples)
* [deepfreeze examples](#deepfreeze-examples)
* [Building](#building)
* [Benchmarks](#benchmarks)
# Introduction
Welcome, fellow programmer, to the house of `frozendict` and
[deepfreeze](#deepfreeze-api)!
`frozendict` is a simple immutable dictionary. It's fast as `dict`, and
[sometimes faster](https://github.com/Marco-Sulla/python-frozendict#benchmarks)!
Unlike other similar implementations, immutability is guaranteed: you can't
change the internal variables of the class, and they are all immutable
objects. Reinvoking `__init__` does not alter the object.
The API is the same as `dict`, without methods that can change the
immutability. So it supports also `fromkeys`, unlike other implementations.
Furthermore it can be `pickle`d, un`pickle`d and have an hash, if all values
are hashable.
You can also add any `dict` to a `frozendict` using the `|` operator. The result is a new `frozendict`.
# Install
You can install `frozendict` by simply typing in a command line:
```bash
pip install frozendict
```
The C Extension is optional by default from version 2.3.5. You can make it mandatory using:
```bash
CIBUILDWHEEL=1 pip install frozendict
```
On the contrary, if you want the pure py implementation:
```bash
FROZENDICT_PURE_PY=1 pip install frozendict
```
# API
## frozendict API
The API is the same of `dict` of Python 3.10, without the methods and operands which alter the map. Additionally, `frozendict` supports these methods:
### `__hash__()`
If all the values of the `frozendict` are hashable, returns an hash, otherwise raises a TypeError.
### `set(key, value)`
It returns a new `frozendict`. If key is already in the original `frozendict`, the new one will have it with the new value associated. Otherwise, the new `frozendict` will contain the new (key, value) item.
### `delete(key)`
It returns a new `frozendict` without the item corresponding to the key. If the key is not present, a KeyError is raised.
### `setdefault(key[, default])`
If key is already in `frozendict`, the object itself is returned unchanged. Otherwise, the new `frozendict` will contain the new (key, default) item. The parameter default defaults to None.
### `key([index])`
It returns the key at the specified index (determined by the insertion order). If index is not passed, it defaults to 0. If the index is negative, the position will be the size of the `frozendict` + index
### `value([index])`
Same as `key(index)`, but it returns the value at the given index.
### `item([index])`
Same as `key(index)`, but it returns a tuple with (key, value) at the given index.
## deepfreeze API
The `frozendict` _module_ has also these static methods:
### `frozendict.deepfreeze(o, custom_converters = None, custom_inverse_converters = None)`
Converts the object and all the objects nested in it, into their immutable
counterparts.
The conversion map is in `getFreezeConversionMap()`.
You can register a new conversion using `register()` You can also
pass a map of custom converters with `custom_converters` and a map
of custom inverse converters with `custom_inverse_converters`,
without using `register()`.
By default, if the type is not registered and has a `__dict__`
attribute, it's converted to the `frozendict` of that `__dict__`.
This function assumes that hashable == immutable (that is not
always true).
This function uses recursion, with all the limits of recursions in
Python.
Where is a good old tail call when you need it?
### `frozendict.register(to_convert, converter, *, inverse = False)`
Adds a `converter` for a type `to_convert`. `converter`
must be callable. The new converter will be used by `deepfreeze()`
and has precedence over any previous converter.
If `to_covert` has already a converter, a FreezeWarning is raised.
If `inverse` is True, the conversion is considered from an immutable
type to a mutable one. This make it possible to convert mutable
objects nested in the registered immutable one.
### `frozendict.unregister(type, inverse = False)`
Unregister a type from custom conversion. If `inverse` is `True`,
the unregistered conversion is an inverse conversion
(see `register()`).
# Examples
## frozendict examples
```python
from frozendict import frozendict
fd = frozendict(Guzzanti = "Corrado", Hicks = "Bill")
print(fd)
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})
frozendict({"Guzzanti": "Corrado", "Hicks": "Bill"})
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})
hash(fd)
# 5833699487320513741
fd_unhashable = frozendict({1: []})
hash(fd_unhashable)
# TypeError: Not all values are hashable.
frozendict({frozendict(nested = 4, key = 2): 42})
# frozendict({frozendict({'nested': 4, 'key': 2}): 42})
fd | {1: 2}
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})
fd.set(1, 2)
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})
fd.set("Guzzanti", "Sabina")
# frozendict.frozendict({'Guzzanti': 'Sabina', 'Hicks': 'Bill'})
fd.delete("Guzzanti")
# frozendict.frozendict({'Hicks': 'Bill'})
fd.setdefault("Guzzanti", "Sabina")
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})
fd.setdefault(1, 2)
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})
fd.key()
# 'Guzzanti'
fd.value(1)
# 'Bill'
fd.item(-1)
# (1, 2)
print(fd["Guzzanti"])
# Corrado
fd["Brignano"]
# KeyError: 'Brignano'
len(fd)
# 2
"Guzzanti" in fd
# True
"Guzzanti" not in fd
# False
"Brignano" in fd
# False
fd5 = frozendict(fd)
id_fd5 = id(fd5)
fd5 |= {1: 2}
fd5
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})
id(fd5) != id_fd5
# True
fd2 = fd.copy()
fd2 == fd
# True
fd3 = frozendict(fd)
fd3 == fd
# True
fd4 = frozendict({"Hicks": "Bill", "Guzzanti": "Corrado"})
print(fd4)
# frozendict({'Hicks': 'Bill', 'Guzzanti': 'Corrado'})
fd4 == fd
# True
import pickle
fd_unpickled = pickle.loads(pickle.dumps(fd))
print(fd_unpickled)
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})
fd_unpickled == fd
# True
frozendict(Guzzanti="Corrado", Hicks="Bill")
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'}
fd.get("Guzzanti")
# 'Corrado'
print(fd.get("Brignano"))
# None
tuple(fd.keys())
# ('Guzzanti', 'Hicks')
tuple(fd.values())
# ('Corrado', 'Bill')
tuple(fd.items())
# (('Guzzanti', 'Corrado'), ('Hicks', 'Bill'))
frozendict.fromkeys(["Corrado", "Sabina"], "Guzzanti")
# frozendict({'Corrado': 'Guzzanti', 'Sabina': 'Guzzanti'})
iter(fd)
# <dict_keyiterator object at 0x7feb75c49188>
fd["Guzzanti"] = "Caterina"
# TypeError: 'frozendict' object doesn't support item assignment
```
## deepfreeze examples
```python
import frozendict as cool
from frozendict import frozendict
from array import array
from collections import OrderedDict
from types import MappingProxyType
class A:
def __init__(self, x):
self.x = x
a = A(3)
o = {"x": [
5,
frozendict(y = {5, "b", memoryview(b"b")}),
array("B", (0, 1, 2)),
OrderedDict(a=bytearray(b"a")),
MappingProxyType({2: []}),
a
]}
cool.deepfreeze(o)
# frozendict(x = (
# 5,
# frozendict(y = frozenset({5, "b", memoryview(b"b")})),
# (0, 1, 2),
# frozendict(a = b'a'),
# MappingProxyType({2: ()}),
# frozendict(x = 3),
# ))
```
# Building
You can build `frozendict` directly from the code, using
```
python3 setup.py bdist_wheel
```
The C Extension is optional by default from version 2.3.5. You can make it mandatory by passing the environment variable `CIBUILDWHEEL` with value `1`
On the contrary, if you want the pure py implementation, you can pass the env var `FROZENDICT_PURE_PY` with value `1`
# Benchmarks
Some benchmarks between `dict` and `frozendict`[1]:
```
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`; Size: 5; Keys: str; Type: dict; Time: 8.02e-08; Sigma: 4e-09
Name: `constructor(d)`; Size: 5; Keys: str; Type: frozendict; Time: 8.81e-08; Sigma: 3e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`; Size: 5; Keys: int; Type: dict; Time: 7.96e-08; Sigma: 5e-09
Name: `constructor(d)`; Size: 5; Keys: int; Type: frozendict; Time: 8.97e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`; Size: 1000; Keys: str; Type: dict; Time: 6.38e-06; Sigma: 9e-08
Name: `constructor(d)`; Size: 1000; Keys: str; Type: frozendict; Time: 6.21e-06; Sigma: 2e-07
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`; Size: 1000; Keys: int; Type: dict; Time: 3.49e-06; Sigma: 3e-07
Name: `constructor(d)`; Size: 1000; Keys: int; Type: frozendict; Time: 3.48e-06; Sigma: 2e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(kwargs)`; Size: 5; Keys: str; Type: dict; Time: 2.40e-07; Sigma: 1e-09
Name: `constructor(kwargs)`; Size: 5; Keys: str; Type: frozendict; Time: 2.48e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(kwargs)`; Size: 1000; Keys: str; Type: dict; Time: 4.80e-05; Sigma: 1e-06
Name: `constructor(kwargs)`; Size: 1000; Keys: str; Type: frozendict; Time: 2.90e-05; Sigma: 7e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`; Size: 5; Keys: str; Type: dict; Time: 2.01e-07; Sigma: 9e-10
Name: `constructor(seq2)`; Size: 5; Keys: str; Type: frozendict; Time: 2.50e-07; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`; Size: 5; Keys: int; Type: dict; Time: 2.18e-07; Sigma: 2e-09
Name: `constructor(seq2)`; Size: 5; Keys: int; Type: frozendict; Time: 2.73e-07; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`; Size: 1000; Keys: str; Type: dict; Time: 4.29e-05; Sigma: 6e-07
Name: `constructor(seq2)`; Size: 1000; Keys: str; Type: frozendict; Time: 4.33e-05; Sigma: 6e-07
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`; Size: 1000; Keys: int; Type: dict; Time: 3.04e-05; Sigma: 4e-07
Name: `constructor(seq2)`; Size: 1000; Keys: int; Type: frozendict; Time: 3.45e-05; Sigma: 4e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`; Size: 5; Keys: str; Type: dict; Time: 7.93e-08; Sigma: 3e-09
Name: `constructor(o)`; Size: 5; Keys: str; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`; Size: 5; Keys: int; Type: dict; Time: 7.94e-08; Sigma: 5e-09
Name: `constructor(o)`; Size: 5; Keys: int; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`; Size: 1000; Keys: str; Type: dict; Time: 6.18e-06; Sigma: 3e-07
Name: `constructor(o)`; Size: 1000; Keys: str; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`; Size: 1000; Keys: int; Type: dict; Time: 3.47e-06; Sigma: 2e-07
Name: `constructor(o)`; Size: 1000; Keys: int; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`; Size: 5; Keys: str; Type: dict; Time: 7.28e-08; Sigma: 2e-09
Name: `o.copy()`; Size: 5; Keys: str; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`; Size: 5; Keys: int; Type: dict; Time: 7.21e-08; Sigma: 4e-09
Name: `o.copy()`; Size: 5; Keys: int; Type: frozendict; Time: 3.32e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`; Size: 1000; Keys: str; Type: dict; Time: 6.16e-06; Sigma: 3e-07
Name: `o.copy()`; Size: 1000; Keys: str; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`; Size: 1000; Keys: int; Type: dict; Time: 3.46e-06; Sigma: 1e-07
Name: `o.copy()`; Size: 1000; Keys: int; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`; Size: 5; Keys: str; Type: dict; Time: 7.23e-08; Sigma: 8e-10
Name: `o == o`; Size: 5; Keys: str; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`; Size: 5; Keys: int; Type: dict; Time: 7.30e-08; Sigma: 1e-09
Name: `o == o`; Size: 5; Keys: int; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`; Size: 1000; Keys: str; Type: dict; Time: 1.38e-05; Sigma: 1e-07
Name: `o == o`; Size: 1000; Keys: str; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`; Size: 1000; Keys: int; Type: dict; Time: 1.05e-05; Sigma: 7e-08
Name: `o == o`; Size: 1000; Keys: int; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`; Size: 5; Keys: str; Type: dict; Time: 7.33e-08; Sigma: 2e-09
Name: `for x in o`; Size: 5; Keys: str; Type: frozendict; Time: 6.70e-08; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`; Size: 5; Keys: int; Type: dict; Time: 7.33e-08; Sigma: 2e-09
Name: `for x in o`; Size: 5; Keys: int; Type: frozendict; Time: 6.70e-08; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`; Size: 1000; Keys: str; Type: dict; Time: 8.84e-06; Sigma: 5e-08
Name: `for x in o`; Size: 1000; Keys: str; Type: frozendict; Time: 7.06e-06; Sigma: 6e-08
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`; Size: 1000; Keys: int; Type: dict; Time: 8.67e-06; Sigma: 7e-08
Name: `for x in o`; Size: 1000; Keys: int; Type: frozendict; Time: 6.94e-06; Sigma: 3e-08
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`; Size: 5; Keys: str; Type: dict; Time: 7.28e-08; Sigma: 9e-10
Name: `for x in o.values()`; Size: 5; Keys: str; Type: frozendict; Time: 6.48e-08; Sigma: 8e-10
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`; Size: 5; Keys: int; Type: dict; Time: 7.25e-08; Sigma: 1e-09
Name: `for x in o.values()`; Size: 5; Keys: int; Type: frozendict; Time: 6.45e-08; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`; Size: 1000; Keys: str; Type: dict; Time: 9.06e-06; Sigma: 5e-07
Name: `for x in o.values()`; Size: 1000; Keys: str; Type: frozendict; Time: 7.04e-06; Sigma: 4e-08
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`; Size: 1000; Keys: int; Type: dict; Time: 9.53e-06; Sigma: 3e-08
Name: `for x in o.values()`; Size: 1000; Keys: int; Type: frozendict; Time: 6.97e-06; Sigma: 3e-08
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`; Size: 5; Keys: str; Type: dict; Time: 1.13e-07; Sigma: 3e-09
Name: `for x in o.items()`; Size: 5; Keys: str; Type: frozendict; Time: 1.16e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`; Size: 5; Keys: int; Type: dict; Time: 1.14e-07; Sigma: 3e-09
Name: `for x in o.items()`; Size: 5; Keys: int; Type: frozendict; Time: 1.17e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`; Size: 1000; Keys: str; Type: dict; Time: 1.53e-05; Sigma: 3e-07
Name: `for x in o.items()`; Size: 1000; Keys: str; Type: frozendict; Time: 1.53e-05; Sigma: 4e-07
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`; Size: 1000; Keys: int; Type: dict; Time: 1.53e-05; Sigma: 3e-07
Name: `for x in o.items()`; Size: 1000; Keys: int; Type: frozendict; Time: 1.55e-05; Sigma: 4e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`; Size: 5; Keys: str; Type: dict; Time: 6.82e-07; Sigma: 2e-08
Name: `pickle.dumps(o)`; Size: 5; Keys: str; Type: frozendict; Time: 2.86e-06; Sigma: 1e-07
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`; Size: 5; Keys: int; Type: dict; Time: 4.77e-07; Sigma: 2e-08
Name: `pickle.dumps(o)`; Size: 5; Keys: int; Type: frozendict; Time: 2.72e-06; Sigma: 8e-08
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`; Size: 1000; Keys: str; Type: dict; Time: 1.24e-04; Sigma: 4e-06
Name: `pickle.dumps(o)`; Size: 1000; Keys: str; Type: frozendict; Time: 1.92e-04; Sigma: 5e-06
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`; Size: 1000; Keys: int; Type: dict; Time: 2.81e-05; Sigma: 6e-07
Name: `pickle.dumps(o)`; Size: 1000; Keys: int; Type: frozendict; Time: 7.37e-05; Sigma: 1e-06
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`; Size: 5; Keys: str; Type: dict; Time: 9.08e-07; Sigma: 6e-09
Name: `pickle.loads(dump)`; Size: 5; Keys: str; Type: frozendict; Time: 1.79e-06; Sigma: 9e-08
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`; Size: 5; Keys: int; Type: dict; Time: 4.46e-07; Sigma: 6e-09
Name: `pickle.loads(dump)`; Size: 5; Keys: int; Type: frozendict; Time: 1.32e-06; Sigma: 7e-08
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`; Size: 1000; Keys: str; Type: dict; Time: 1.57e-04; Sigma: 8e-06
Name: `pickle.loads(dump)`; Size: 1000; Keys: str; Type: frozendict; Time: 1.69e-04; Sigma: 7e-06
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`; Size: 1000; Keys: int; Type: dict; Time: 5.97e-05; Sigma: 5e-06
Name: `pickle.loads(dump)`; Size: 1000; Keys: int; Type: frozendict; Time: 6.68e-05; Sigma: 2e-06
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`; Size: 5; Keys: str; Type: dict; Time: 1.88e-07; Sigma: 1e-09
Name: `class.fromkeys()`; Size: 5; Keys: str; Type: frozendict; Time: 2.22e-07; Sigma: 7e-09
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`; Size: 5; Keys: int; Type: dict; Time: 2.08e-07; Sigma: 6e-09
Name: `class.fromkeys()`; Size: 5; Keys: int; Type: frozendict; Time: 2.44e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`; Size: 1000; Keys: str; Type: dict; Time: 4.05e-05; Sigma: 4e-06
Name: `class.fromkeys()`; Size: 1000; Keys: str; Type: frozendict; Time: 3.84e-05; Sigma: 5e-07
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`; Size: 1000; Keys: int; Type: dict; Time: 2.93e-05; Sigma: 7e-07
Name: `class.fromkeys()`; Size: 1000; Keys: int; Type: frozendict; Time: 3.08e-05; Sigma: 2e-06
################################################################################
```
[1] Benchmarks done under Linux 64 bit, Python 3.10.2, using the C Extension.
Raw data
{
"_id": null,
"home_page": "https://github.com/Marco-Sulla/python-frozendict",
"name": "frozendict",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "immutable hashable picklable frozendict dict dictionary map Mapping MappingProxyType developers stable utility",
"author": "Marco Sulla",
"author_email": "marcosullaroma@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c7/e4/e2a3d029f923b0b8796b57cf0def34f7ed9071557dbfde15bd4331bc3e08/frozendict-2.4.2.tar.gz",
"platform": null,
"description": "# frozendict\n### Table of Contents\n* [Introduction](#introduction)\n* [Install](#install)\n* [API](#api)\n * [frozendict API](#frozendict-api)\n * [deepfreeze API](#deepfreeze-api)\n* [Examples](#examples)\n * [frozendict examples](#frozendict-examples)\n * [deepfreeze examples](#deepfreeze-examples)\n* [Building](#building)\n* [Benchmarks](#benchmarks)\n\n# Introduction\nWelcome, fellow programmer, to the house of `frozendict` and \n[deepfreeze](#deepfreeze-api)!\n\n`frozendict` is a simple immutable dictionary. It's fast as `dict`, and \n[sometimes faster](https://github.com/Marco-Sulla/python-frozendict#benchmarks)!\n\nUnlike other similar implementations, immutability is guaranteed: you can't \nchange the internal variables of the class, and they are all immutable \nobjects. Reinvoking `__init__` does not alter the object.\n\nThe API is the same as `dict`, without methods that can change the \nimmutability. So it supports also `fromkeys`, unlike other implementations. \nFurthermore it can be `pickle`d, un`pickle`d and have an hash, if all values \nare hashable.\n\nYou can also add any `dict` to a `frozendict` using the `|` operator. The result is a new `frozendict`.\n\n# Install\n\nYou can install `frozendict` by simply typing in a command line:\n\n```bash\npip install frozendict\n```\n\nThe C Extension is optional by default from version 2.3.5. You can make it mandatory using:\n\n```bash\nCIBUILDWHEEL=1 pip install frozendict\n```\n\nOn the contrary, if you want the pure py implementation:\n\n```bash\nFROZENDICT_PURE_PY=1 pip install frozendict\n```\n\n# API\n\n## frozendict API\nThe API is the same of `dict` of Python 3.10, without the methods and operands which alter the map. Additionally, `frozendict` supports these methods:\n\n### `__hash__()`\n\nIf all the values of the `frozendict` are hashable, returns an hash, otherwise raises a TypeError.\n\n### `set(key, value)`\n\nIt returns a new `frozendict`. If key is already in the original `frozendict`, the new one will have it with the new value associated. Otherwise, the new `frozendict` will contain the new (key, value) item.\n\n### `delete(key)`\n\nIt returns a new `frozendict` without the item corresponding to the key. If the key is not present, a KeyError is raised.\n\n### `setdefault(key[, default])`\n\nIf key is already in `frozendict`, the object itself is returned unchanged. Otherwise, the new `frozendict` will contain the new (key, default) item. The parameter default defaults to None.\n\n### `key([index])`\n\nIt returns the key at the specified index (determined by the insertion order). If index is not passed, it defaults to 0. If the index is negative, the position will be the size of the `frozendict` + index\n\n### `value([index])`\nSame as `key(index)`, but it returns the value at the given index.\n\n### `item([index])`\nSame as `key(index)`, but it returns a tuple with (key, value) at the given index.\n\n## deepfreeze API\n\nThe `frozendict` _module_ has also these static methods:\n\n### `frozendict.deepfreeze(o, custom_converters = None, custom_inverse_converters = None)`\nConverts the object and all the objects nested in it, into their immutable\ncounterparts.\n\nThe conversion map is in `getFreezeConversionMap()`.\n\nYou can register a new conversion using `register()` You can also \npass a map of custom converters with `custom_converters` and a map \nof custom inverse converters with `custom_inverse_converters`, \nwithout using `register()`.\n\nBy default, if the type is not registered and has a `__dict__` \nattribute, it's converted to the `frozendict` of that `__dict__`.\n\nThis function assumes that hashable == immutable (that is not \nalways true).\n\nThis function uses recursion, with all the limits of recursions in \nPython.\n\nWhere is a good old tail call when you need it?\n\n### `frozendict.register(to_convert, converter, *, inverse = False)`\n\nAdds a `converter` for a type `to_convert`. `converter`\nmust be callable. The new converter will be used by `deepfreeze()`\nand has precedence over any previous converter. \n\nIf `to_covert` has already a converter, a FreezeWarning is raised.\n\nIf `inverse` is True, the conversion is considered from an immutable \ntype to a mutable one. This make it possible to convert mutable \nobjects nested in the registered immutable one.\n\n### `frozendict.unregister(type, inverse = False)`\nUnregister a type from custom conversion. If `inverse` is `True`, \nthe unregistered conversion is an inverse conversion \n(see `register()`).\n\n# Examples\n\n## frozendict examples\n```python\nfrom frozendict import frozendict\n\nfd = frozendict(Guzzanti = \"Corrado\", Hicks = \"Bill\")\n\nprint(fd)\n# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})\n\nfrozendict({\"Guzzanti\": \"Corrado\", \"Hicks\": \"Bill\"})\n# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})\n\nhash(fd)\n# 5833699487320513741\n\nfd_unhashable = frozendict({1: []})\nhash(fd_unhashable)\n# TypeError: Not all values are hashable.\n\nfrozendict({frozendict(nested = 4, key = 2): 42})\n# frozendict({frozendict({'nested': 4, 'key': 2}): 42})\n\nfd | {1: 2}\n# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})\n\nfd.set(1, 2)\n# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})\n\nfd.set(\"Guzzanti\", \"Sabina\")\n# frozendict.frozendict({'Guzzanti': 'Sabina', 'Hicks': 'Bill'})\n\nfd.delete(\"Guzzanti\")\n# frozendict.frozendict({'Hicks': 'Bill'})\n\nfd.setdefault(\"Guzzanti\", \"Sabina\")\n# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})\n\nfd.setdefault(1, 2)\n# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})\n\nfd.key()\n# 'Guzzanti'\n\nfd.value(1)\n# 'Bill'\n\nfd.item(-1)\n# (1, 2)\n\nprint(fd[\"Guzzanti\"])\n# Corrado\n\nfd[\"Brignano\"]\n# KeyError: 'Brignano'\n\nlen(fd)\n# 2\n\n\"Guzzanti\" in fd\n# True\n\n\"Guzzanti\" not in fd\n# False\n\n\"Brignano\" in fd\n# False\n\nfd5 = frozendict(fd)\nid_fd5 = id(fd5)\nfd5 |= {1: 2}\nfd5\n# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})\nid(fd5) != id_fd5\n# True\n\nfd2 = fd.copy()\nfd2 == fd\n# True\n\nfd3 = frozendict(fd)\nfd3 == fd\n# True\n\nfd4 = frozendict({\"Hicks\": \"Bill\", \"Guzzanti\": \"Corrado\"})\n\nprint(fd4)\n# frozendict({'Hicks': 'Bill', 'Guzzanti': 'Corrado'})\n\nfd4 == fd\n# True\n\nimport pickle\nfd_unpickled = pickle.loads(pickle.dumps(fd))\nprint(fd_unpickled)\n# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})\nfd_unpickled == fd\n# True\n\nfrozendict(Guzzanti=\"Corrado\", Hicks=\"Bill\")\n# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'}\n\nfd.get(\"Guzzanti\")\n# 'Corrado'\n\nprint(fd.get(\"Brignano\"))\n# None\n\ntuple(fd.keys())\n# ('Guzzanti', 'Hicks')\n\ntuple(fd.values())\n# ('Corrado', 'Bill')\n\ntuple(fd.items())\n# (('Guzzanti', 'Corrado'), ('Hicks', 'Bill'))\n\nfrozendict.fromkeys([\"Corrado\", \"Sabina\"], \"Guzzanti\")\n# frozendict({'Corrado': 'Guzzanti', 'Sabina': 'Guzzanti'})\n\niter(fd)\n# <dict_keyiterator object at 0x7feb75c49188>\n\nfd[\"Guzzanti\"] = \"Caterina\"\n# TypeError: 'frozendict' object doesn't support item assignment\n```\n\n## deepfreeze examples\n```python\nimport frozendict as cool\n\nfrom frozendict import frozendict\nfrom array import array\nfrom collections import OrderedDict\nfrom types import MappingProxyType\n\nclass A:\n def __init__(self, x):\n self.x = x\n\na = A(3)\n \no = {\"x\": [\n 5, \n frozendict(y = {5, \"b\", memoryview(b\"b\")}), \n array(\"B\", (0, 1, 2)), \n OrderedDict(a=bytearray(b\"a\")),\n MappingProxyType({2: []}),\n a\n]}\n\ncool.deepfreeze(o)\n# frozendict(x = (\n# 5, \n# frozendict(y = frozenset({5, \"b\", memoryview(b\"b\")})), \n# (0, 1, 2), \n# frozendict(a = b'a'),\n# MappingProxyType({2: ()}),\n# frozendict(x = 3),\n# ))\n\n```\n\n# Building\nYou can build `frozendict` directly from the code, using\n\n```\npython3 setup.py bdist_wheel\n```\n\nThe C Extension is optional by default from version 2.3.5. You can make it mandatory by passing the environment variable `CIBUILDWHEEL` with value `1`\n\nOn the contrary, if you want the pure py implementation, you can pass the env var `FROZENDICT_PURE_PY` with value `1`\n\n# Benchmarks\n\nSome benchmarks between `dict` and `frozendict`[1]:\n\n```\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(d)`; Size: 5; Keys: str; Type: dict; Time: 8.02e-08; Sigma: 4e-09\nName: `constructor(d)`; Size: 5; Keys: str; Type: frozendict; Time: 8.81e-08; Sigma: 3e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(d)`; Size: 5; Keys: int; Type: dict; Time: 7.96e-08; Sigma: 5e-09\nName: `constructor(d)`; Size: 5; Keys: int; Type: frozendict; Time: 8.97e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(d)`; Size: 1000; Keys: str; Type: dict; Time: 6.38e-06; Sigma: 9e-08\nName: `constructor(d)`; Size: 1000; Keys: str; Type: frozendict; Time: 6.21e-06; Sigma: 2e-07\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(d)`; Size: 1000; Keys: int; Type: dict; Time: 3.49e-06; Sigma: 3e-07\nName: `constructor(d)`; Size: 1000; Keys: int; Type: frozendict; Time: 3.48e-06; Sigma: 2e-07\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(kwargs)`; Size: 5; Keys: str; Type: dict; Time: 2.40e-07; Sigma: 1e-09\nName: `constructor(kwargs)`; Size: 5; Keys: str; Type: frozendict; Time: 2.48e-07; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(kwargs)`; Size: 1000; Keys: str; Type: dict; Time: 4.80e-05; Sigma: 1e-06\nName: `constructor(kwargs)`; Size: 1000; Keys: str; Type: frozendict; Time: 2.90e-05; Sigma: 7e-07\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(seq2)`; Size: 5; Keys: str; Type: dict; Time: 2.01e-07; Sigma: 9e-10\nName: `constructor(seq2)`; Size: 5; Keys: str; Type: frozendict; Time: 2.50e-07; Sigma: 1e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(seq2)`; Size: 5; Keys: int; Type: dict; Time: 2.18e-07; Sigma: 2e-09\nName: `constructor(seq2)`; Size: 5; Keys: int; Type: frozendict; Time: 2.73e-07; Sigma: 1e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(seq2)`; Size: 1000; Keys: str; Type: dict; Time: 4.29e-05; Sigma: 6e-07\nName: `constructor(seq2)`; Size: 1000; Keys: str; Type: frozendict; Time: 4.33e-05; Sigma: 6e-07\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(seq2)`; Size: 1000; Keys: int; Type: dict; Time: 3.04e-05; Sigma: 4e-07\nName: `constructor(seq2)`; Size: 1000; Keys: int; Type: frozendict; Time: 3.45e-05; Sigma: 4e-07\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(o)`; Size: 5; Keys: str; Type: dict; Time: 7.93e-08; Sigma: 3e-09\nName: `constructor(o)`; Size: 5; Keys: str; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(o)`; Size: 5; Keys: int; Type: dict; Time: 7.94e-08; Sigma: 5e-09\nName: `constructor(o)`; Size: 5; Keys: int; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(o)`; Size: 1000; Keys: str; Type: dict; Time: 6.18e-06; Sigma: 3e-07\nName: `constructor(o)`; Size: 1000; Keys: str; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10\n////////////////////////////////////////////////////////////////////////////////\nName: `constructor(o)`; Size: 1000; Keys: int; Type: dict; Time: 3.47e-06; Sigma: 2e-07\nName: `constructor(o)`; Size: 1000; Keys: int; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `o.copy()`; Size: 5; Keys: str; Type: dict; Time: 7.28e-08; Sigma: 2e-09\nName: `o.copy()`; Size: 5; Keys: str; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `o.copy()`; Size: 5; Keys: int; Type: dict; Time: 7.21e-08; Sigma: 4e-09\nName: `o.copy()`; Size: 5; Keys: int; Type: frozendict; Time: 3.32e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `o.copy()`; Size: 1000; Keys: str; Type: dict; Time: 6.16e-06; Sigma: 3e-07\nName: `o.copy()`; Size: 1000; Keys: str; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `o.copy()`; Size: 1000; Keys: int; Type: dict; Time: 3.46e-06; Sigma: 1e-07\nName: `o.copy()`; Size: 1000; Keys: int; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `o == o`; Size: 5; Keys: str; Type: dict; Time: 7.23e-08; Sigma: 8e-10\nName: `o == o`; Size: 5; Keys: str; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `o == o`; Size: 5; Keys: int; Type: dict; Time: 7.30e-08; Sigma: 1e-09\nName: `o == o`; Size: 5; Keys: int; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `o == o`; Size: 1000; Keys: str; Type: dict; Time: 1.38e-05; Sigma: 1e-07\nName: `o == o`; Size: 1000; Keys: str; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `o == o`; Size: 1000; Keys: int; Type: dict; Time: 1.05e-05; Sigma: 7e-08\nName: `o == o`; Size: 1000; Keys: int; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o`; Size: 5; Keys: str; Type: dict; Time: 7.33e-08; Sigma: 2e-09\nName: `for x in o`; Size: 5; Keys: str; Type: frozendict; Time: 6.70e-08; Sigma: 1e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o`; Size: 5; Keys: int; Type: dict; Time: 7.33e-08; Sigma: 2e-09\nName: `for x in o`; Size: 5; Keys: int; Type: frozendict; Time: 6.70e-08; Sigma: 1e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o`; Size: 1000; Keys: str; Type: dict; Time: 8.84e-06; Sigma: 5e-08\nName: `for x in o`; Size: 1000; Keys: str; Type: frozendict; Time: 7.06e-06; Sigma: 6e-08\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o`; Size: 1000; Keys: int; Type: dict; Time: 8.67e-06; Sigma: 7e-08\nName: `for x in o`; Size: 1000; Keys: int; Type: frozendict; Time: 6.94e-06; Sigma: 3e-08\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.values()`; Size: 5; Keys: str; Type: dict; Time: 7.28e-08; Sigma: 9e-10\nName: `for x in o.values()`; Size: 5; Keys: str; Type: frozendict; Time: 6.48e-08; Sigma: 8e-10\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.values()`; Size: 5; Keys: int; Type: dict; Time: 7.25e-08; Sigma: 1e-09\nName: `for x in o.values()`; Size: 5; Keys: int; Type: frozendict; Time: 6.45e-08; Sigma: 1e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.values()`; Size: 1000; Keys: str; Type: dict; Time: 9.06e-06; Sigma: 5e-07\nName: `for x in o.values()`; Size: 1000; Keys: str; Type: frozendict; Time: 7.04e-06; Sigma: 4e-08\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.values()`; Size: 1000; Keys: int; Type: dict; Time: 9.53e-06; Sigma: 3e-08\nName: `for x in o.values()`; Size: 1000; Keys: int; Type: frozendict; Time: 6.97e-06; Sigma: 3e-08\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.items()`; Size: 5; Keys: str; Type: dict; Time: 1.13e-07; Sigma: 3e-09\nName: `for x in o.items()`; Size: 5; Keys: str; Type: frozendict; Time: 1.16e-07; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.items()`; Size: 5; Keys: int; Type: dict; Time: 1.14e-07; Sigma: 3e-09\nName: `for x in o.items()`; Size: 5; Keys: int; Type: frozendict; Time: 1.17e-07; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.items()`; Size: 1000; Keys: str; Type: dict; Time: 1.53e-05; Sigma: 3e-07\nName: `for x in o.items()`; Size: 1000; Keys: str; Type: frozendict; Time: 1.53e-05; Sigma: 4e-07\n////////////////////////////////////////////////////////////////////////////////\nName: `for x in o.items()`; Size: 1000; Keys: int; Type: dict; Time: 1.53e-05; Sigma: 3e-07\nName: `for x in o.items()`; Size: 1000; Keys: int; Type: frozendict; Time: 1.55e-05; Sigma: 4e-07\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.dumps(o)`; Size: 5; Keys: str; Type: dict; Time: 6.82e-07; Sigma: 2e-08\nName: `pickle.dumps(o)`; Size: 5; Keys: str; Type: frozendict; Time: 2.86e-06; Sigma: 1e-07\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.dumps(o)`; Size: 5; Keys: int; Type: dict; Time: 4.77e-07; Sigma: 2e-08\nName: `pickle.dumps(o)`; Size: 5; Keys: int; Type: frozendict; Time: 2.72e-06; Sigma: 8e-08\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.dumps(o)`; Size: 1000; Keys: str; Type: dict; Time: 1.24e-04; Sigma: 4e-06\nName: `pickle.dumps(o)`; Size: 1000; Keys: str; Type: frozendict; Time: 1.92e-04; Sigma: 5e-06\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.dumps(o)`; Size: 1000; Keys: int; Type: dict; Time: 2.81e-05; Sigma: 6e-07\nName: `pickle.dumps(o)`; Size: 1000; Keys: int; Type: frozendict; Time: 7.37e-05; Sigma: 1e-06\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.loads(dump)`; Size: 5; Keys: str; Type: dict; Time: 9.08e-07; Sigma: 6e-09\nName: `pickle.loads(dump)`; Size: 5; Keys: str; Type: frozendict; Time: 1.79e-06; Sigma: 9e-08\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.loads(dump)`; Size: 5; Keys: int; Type: dict; Time: 4.46e-07; Sigma: 6e-09\nName: `pickle.loads(dump)`; Size: 5; Keys: int; Type: frozendict; Time: 1.32e-06; Sigma: 7e-08\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.loads(dump)`; Size: 1000; Keys: str; Type: dict; Time: 1.57e-04; Sigma: 8e-06\nName: `pickle.loads(dump)`; Size: 1000; Keys: str; Type: frozendict; Time: 1.69e-04; Sigma: 7e-06\n////////////////////////////////////////////////////////////////////////////////\nName: `pickle.loads(dump)`; Size: 1000; Keys: int; Type: dict; Time: 5.97e-05; Sigma: 5e-06\nName: `pickle.loads(dump)`; Size: 1000; Keys: int; Type: frozendict; Time: 6.68e-05; Sigma: 2e-06\n################################################################################\n////////////////////////////////////////////////////////////////////////////////\nName: `class.fromkeys()`; Size: 5; Keys: str; Type: dict; Time: 1.88e-07; Sigma: 1e-09\nName: `class.fromkeys()`; Size: 5; Keys: str; Type: frozendict; Time: 2.22e-07; Sigma: 7e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `class.fromkeys()`; Size: 5; Keys: int; Type: dict; Time: 2.08e-07; Sigma: 6e-09\nName: `class.fromkeys()`; Size: 5; Keys: int; Type: frozendict; Time: 2.44e-07; Sigma: 2e-09\n////////////////////////////////////////////////////////////////////////////////\nName: `class.fromkeys()`; Size: 1000; Keys: str; Type: dict; Time: 4.05e-05; Sigma: 4e-06\nName: `class.fromkeys()`; Size: 1000; Keys: str; Type: frozendict; Time: 3.84e-05; Sigma: 5e-07\n////////////////////////////////////////////////////////////////////////////////\nName: `class.fromkeys()`; Size: 1000; Keys: int; Type: dict; Time: 2.93e-05; Sigma: 7e-07\nName: `class.fromkeys()`; Size: 1000; Keys: int; Type: frozendict; Time: 3.08e-05; Sigma: 2e-06\n################################################################################\n```\n\n[1] Benchmarks done under Linux 64 bit, Python 3.10.2, using the C Extension.\n",
"bugtrack_url": null,
"license": "LGPL v3",
"summary": "A simple immutable dictionary",
"version": "2.4.2",
"project_urls": {
"Bug Reports": "https://github.com/Marco-Sulla/python-frozendict/issues",
"Homepage": "https://github.com/Marco-Sulla/python-frozendict",
"Source": "https://github.com/Marco-Sulla/python-frozendict"
},
"split_keywords": [
"immutable",
"hashable",
"picklable",
"frozendict",
"dict",
"dictionary",
"map",
"mapping",
"mappingproxytype",
"developers",
"stable",
"utility"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "eaf041397e9d929f9da1f517ebb95b75d14453459aea50cd67268f170d34a1d4",
"md5": "387594f7623b1e8ad831cd29d4d95d7f",
"sha256": "19743495b1e92a7e4db56fcd6a5d36ea1d1b0f550822d6fd780e44d58f0b8c18"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "387594f7623b1e8ad831cd29d4d95d7f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 37809,
"upload_time": "2024-04-14T11:37:47",
"upload_time_iso_8601": "2024-04-14T11:37:47.165663Z",
"url": "https://files.pythonhosted.org/packages/ea/f0/41397e9d929f9da1f517ebb95b75d14453459aea50cd67268f170d34a1d4/frozendict-2.4.2-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "084179e71ca66e6c6d1a871dbc1f662d55d0df014d77a960466c800b1990ab3d",
"md5": "102e6c0e7e5a2b3b2f67e60ae34e717e",
"sha256": "81efb4ea854a1c93d954a67389eaf78c508acb2d4768321a835cda2754ec5c01"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "102e6c0e7e5a2b3b2f67e60ae34e717e",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 37668,
"upload_time": "2024-04-14T11:37:49",
"upload_time_iso_8601": "2024-04-14T11:37:49.694348Z",
"url": "https://files.pythonhosted.org/packages/08/41/79e71ca66e6c6d1a871dbc1f662d55d0df014d77a960466c800b1990ab3d/frozendict-2.4.2-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "740e825971a9b50a96d0ef31c76a4a965933269f980ed3feb5fa8efda199f316",
"md5": "1fca901bee8ebeb16b547173a84da598",
"sha256": "c5f1a4d9662b854dce52b560b60f51349905dc871826b8c6be20141a13067a53"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "1fca901bee8ebeb16b547173a84da598",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 116996,
"upload_time": "2024-04-14T11:37:51",
"upload_time_iso_8601": "2024-04-14T11:37:51.994894Z",
"url": "https://files.pythonhosted.org/packages/74/0e/825971a9b50a96d0ef31c76a4a965933269f980ed3feb5fa8efda199f316/frozendict-2.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3adb72e99b83e3fc855edf2825a7082dfe3ca0cb68c1e7541f33be0c879c1641",
"md5": "11e4dac0799de7ce503c6bbb0956c610",
"sha256": "1412aeb325e4a28cfe32106c66c046372bb7fd5a9af1748193549c5d01a9e9c1"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "11e4dac0799de7ce503c6bbb0956c610",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 116795,
"upload_time": "2024-04-14T11:37:54",
"upload_time_iso_8601": "2024-04-14T11:37:54.226965Z",
"url": "https://files.pythonhosted.org/packages/3a/db/72e99b83e3fc855edf2825a7082dfe3ca0cb68c1e7541f33be0c879c1641/frozendict-2.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7f1f15420cb3ec7d54ea0bea8ee8496d7e987cbb7c2b1c0a7b46d4816c40642e",
"md5": "8ecb92578641e7d1b6e1b7d3212d1360",
"sha256": "f7ce0535f02eba9746e4e2cf0abef0f0f2051d20fdccf4af31bc3d1adecf5a71"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "8ecb92578641e7d1b6e1b7d3212d1360",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 118652,
"upload_time": "2024-04-14T11:37:56",
"upload_time_iso_8601": "2024-04-14T11:37:56.580051Z",
"url": "https://files.pythonhosted.org/packages/7f/1f/15420cb3ec7d54ea0bea8ee8496d7e987cbb7c2b1c0a7b46d4816c40642e/frozendict-2.4.2-cp310-cp310-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4de29e200027761db7d158c2ffaba432ea78fb39c7cf3036f7c1fd30dcf7cb50",
"md5": "83e78381b38ee14e29b7e5f39e446d01",
"sha256": "07153e6d2720fa1131bb180ce388c7042affb29561d8bcd1c0d6e683a8beaea2"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "83e78381b38ee14e29b7e5f39e446d01",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 117986,
"upload_time": "2024-04-14T11:37:59",
"upload_time_iso_8601": "2024-04-14T11:37:59.158144Z",
"url": "https://files.pythonhosted.org/packages/4d/e2/9e200027761db7d158c2ffaba432ea78fb39c7cf3036f7c1fd30dcf7cb50/frozendict-2.4.2-cp310-cp310-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fb540c82381f77915ea879d1b413700e121c66c2a20a09c65f940dbc8cc17c7b",
"md5": "ddd72a713ec98fcee1719012c3aa9f69",
"sha256": "f7a90ea6d5248617a1222daef07d22fb146ff07635a36db327e1ce114bf3e304"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "ddd72a713ec98fcee1719012c3aa9f69",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 36713,
"upload_time": "2024-04-14T11:38:01",
"upload_time_iso_8601": "2024-04-14T11:38:01.466025Z",
"url": "https://files.pythonhosted.org/packages/fb/54/0c82381f77915ea879d1b413700e121c66c2a20a09c65f940dbc8cc17c7b/frozendict-2.4.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9976a71fa3e97a6c85958aeb9c5aeb3843e7592727307632d53856a0b7409586",
"md5": "c79c0a8d5dee2c60716dc80eb4c708ec",
"sha256": "20a6f741c92fdeb3766924cde42b8ee445cf568e3be8aa983cb83e9fe5b61e63"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp310-cp310-win_arm64.whl",
"has_sig": false,
"md5_digest": "c79c0a8d5dee2c60716dc80eb4c708ec",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 33354,
"upload_time": "2024-04-14T11:38:03",
"upload_time_iso_8601": "2024-04-14T11:38:03.141828Z",
"url": "https://files.pythonhosted.org/packages/99/76/a71fa3e97a6c85958aeb9c5aeb3843e7592727307632d53856a0b7409586/frozendict-2.4.2-cp310-cp310-win_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "72c28c273161bd4b5bd56e63b5368d8cd59b945cb92e795e444ec00d2106a2c8",
"md5": "57b027c0060d70b67d70fca20eae0449",
"sha256": "146129502cd9d96de64e0c8f7dc4c66422da3d4bfccf891dd80a3821b358a926"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp36-cp36m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "57b027c0060d70b67d70fca20eae0449",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 36782,
"upload_time": "2024-04-14T11:38:04",
"upload_time_iso_8601": "2024-04-14T11:38:04.568146Z",
"url": "https://files.pythonhosted.org/packages/72/c2/8c273161bd4b5bd56e63b5368d8cd59b945cb92e795e444ec00d2106a2c8/frozendict-2.4.2-cp36-cp36m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ffcaa798431b9fd0cd3fc31223750c4798f9d86fb2929de87c747949562437da",
"md5": "5f1457236f9bffe250f5c22f5bd53f96",
"sha256": "9ac1f74ccf818977abbc1868090c06436b8f06534d306f808f15cffc304ae046"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "5f1457236f9bffe250f5c22f5bd53f96",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 101451,
"upload_time": "2024-04-14T11:38:06",
"upload_time_iso_8601": "2024-04-14T11:38:06.369296Z",
"url": "https://files.pythonhosted.org/packages/ff/ca/a798431b9fd0cd3fc31223750c4798f9d86fb2929de87c747949562437da/frozendict-2.4.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "97c1b193fbb5e9dd310cd94fd6809142a860b4d6c3a3413bb1e16c5cf7c3e3e4",
"md5": "d4a06f33ae213c3b9399f95e42d5a7e1",
"sha256": "7a8d2ea4f10505ad15f53ce3742420682d916d0c4d566edb8e1019756e7cea30"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d4a06f33ae213c3b9399f95e42d5a7e1",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 101260,
"upload_time": "2024-04-14T11:38:08",
"upload_time_iso_8601": "2024-04-14T11:38:08.925948Z",
"url": "https://files.pythonhosted.org/packages/97/c1/b193fbb5e9dd310cd94fd6809142a860b4d6c3a3413bb1e16c5cf7c3e3e4/frozendict-2.4.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "34b389173761648195ee3ec7831e9ecb30bcea9f8670faa5ffb46a643ddebe46",
"md5": "0a3acf8c33eb160398a15e548adca1ae",
"sha256": "4a5841681e70d2862ca153543f2912e0bab034bf29e2d3610e86ea42506121c2"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp36-cp36m-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "0a3acf8c33eb160398a15e548adca1ae",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 104328,
"upload_time": "2024-04-14T11:38:11",
"upload_time_iso_8601": "2024-04-14T11:38:11.638301Z",
"url": "https://files.pythonhosted.org/packages/34/b3/89173761648195ee3ec7831e9ecb30bcea9f8670faa5ffb46a643ddebe46/frozendict-2.4.2-cp36-cp36m-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b82a554ea101e624bc5c92d72ce738ea9f3f96fd3fe7d4325a98a731cdb0ca91",
"md5": "08684f37e5e25f934579c04ac5d09808",
"sha256": "d4a10119f17552cbeab48d4ae830ba091c6d47616589618adc31f251184579a7"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp36-cp36m-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "08684f37e5e25f934579c04ac5d09808",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 103806,
"upload_time": "2024-04-14T11:38:14",
"upload_time_iso_8601": "2024-04-14T11:38:14.097565Z",
"url": "https://files.pythonhosted.org/packages/b8/2a/554ea101e624bc5c92d72ce738ea9f3f96fd3fe7d4325a98a731cdb0ca91/frozendict-2.4.2-cp36-cp36m-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c63963e7b6f7c03fac48780bef4c8f938afce2459b0ae715cb7dbb9fecb2265f",
"md5": "1e05b1d9212d645c00ecb23a7ce05060",
"sha256": "7d13ffe649e9db6f4bb5e107d9be7dfd23e13101bc69f97aa5fa6cbf6aecaadd"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp36-cp36m-win_amd64.whl",
"has_sig": false,
"md5_digest": "1e05b1d9212d645c00ecb23a7ce05060",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 38279,
"upload_time": "2024-04-14T11:38:16",
"upload_time_iso_8601": "2024-04-14T11:38:16.618398Z",
"url": "https://files.pythonhosted.org/packages/c6/39/63e7b6f7c03fac48780bef4c8f938afce2459b0ae715cb7dbb9fecb2265f/frozendict-2.4.2-cp36-cp36m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8d8b5dc3123e85f17679454a20f72dee2fb987abc0e53208ada9df266ebcd355",
"md5": "ac23c5434deb299eea4157f51674221b",
"sha256": "19e64630e164a297f83e9a1c69f1cd36fa4b3d1196c1f9fc006a0385aa198ea4"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp37-cp37m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "ac23c5434deb299eea4157f51674221b",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 37029,
"upload_time": "2024-04-14T11:38:18",
"upload_time_iso_8601": "2024-04-14T11:38:18.595747Z",
"url": "https://files.pythonhosted.org/packages/8d/8b/5dc3123e85f17679454a20f72dee2fb987abc0e53208ada9df266ebcd355/frozendict-2.4.2-cp37-cp37m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b4fd6dfa1878bd3d679830bf3e09f7f2a0e2cf8a7df693b2a856d5cf9ebf04c6",
"md5": "86842db80d4ce84eda5db05cf519b305",
"sha256": "bedb0a6587bae53bd53727b92a87c4cf90ad7a7e0bd2db562d439beb6982712e"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "86842db80d4ce84eda5db05cf519b305",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 103238,
"upload_time": "2024-04-14T11:38:20",
"upload_time_iso_8601": "2024-04-14T11:38:20.497523Z",
"url": "https://files.pythonhosted.org/packages/b4/fd/6dfa1878bd3d679830bf3e09f7f2a0e2cf8a7df693b2a856d5cf9ebf04c6/frozendict-2.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0aff2313d44c8bb06e0d7fc8adb72b11368d1d72c1cf41e11cdad4d1539e54d6",
"md5": "30867a0c08685654fc28dd1958beb700",
"sha256": "83cc9d063131fd8adbeb18a473d222b5dc8301cac9505cfe578158f9a9bf55a9"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "30867a0c08685654fc28dd1958beb700",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 103140,
"upload_time": "2024-04-14T11:38:22",
"upload_time_iso_8601": "2024-04-14T11:38:22.816938Z",
"url": "https://files.pythonhosted.org/packages/0a/ff/2313d44c8bb06e0d7fc8adb72b11368d1d72c1cf41e11cdad4d1539e54d6/frozendict-2.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "71edfa1d9186ed6dbfcaa3b887b01db972f6d02b83ecd7ea413a2df233007e23",
"md5": "379969c7c2ab946782157808d20cd6e4",
"sha256": "92c46b155ea9eb9ecabc66ba2d9030f2634319f55c6448688965ece094f14b51"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp37-cp37m-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "379969c7c2ab946782157808d20cd6e4",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 105935,
"upload_time": "2024-04-14T11:38:25",
"upload_time_iso_8601": "2024-04-14T11:38:25.454451Z",
"url": "https://files.pythonhosted.org/packages/71/ed/fa1d9186ed6dbfcaa3b887b01db972f6d02b83ecd7ea413a2df233007e23/frozendict-2.4.2-cp37-cp37m-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "78e623fa9e831b01b152e9e423b26b88ffd8fd5f07bc23125a3b46edbbe5a8fc",
"md5": "33bbbb2c4d9da0297f1c1c3448d45512",
"sha256": "f958d40637e0440bce2453019821c94fe86cfc5f3847ae11cd4f02c3548b1d1b"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp37-cp37m-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "33bbbb2c4d9da0297f1c1c3448d45512",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 105445,
"upload_time": "2024-04-14T11:38:27",
"upload_time_iso_8601": "2024-04-14T11:38:27.459642Z",
"url": "https://files.pythonhosted.org/packages/78/e6/23fa9e831b01b152e9e423b26b88ffd8fd5f07bc23125a3b46edbbe5a8fc/frozendict-2.4.2-cp37-cp37m-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fdb31739333f107328760bced262c26cdf3a7452c6c9adc6f5b3c754e991dc88",
"md5": "3aa10c3d8154e22c4708579a7cb2196a",
"sha256": "ac954be447a907face9b652207fbd943b9b552212890db959ba653e8f1dc3f56"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "3aa10c3d8154e22c4708579a7cb2196a",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 36535,
"upload_time": "2024-04-14T11:38:29",
"upload_time_iso_8601": "2024-04-14T11:38:29.010650Z",
"url": "https://files.pythonhosted.org/packages/fd/b3/1739333f107328760bced262c26cdf3a7452c6c9adc6f5b3c754e991dc88/frozendict-2.4.2-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8fe402e2a076c83f507851885df18424a74dfd88bd4c11d39ddf51c13a555d15",
"md5": "dab042579be3ff1774df337d015925d8",
"sha256": "f7e0ff5e84742604a1b42c2de4f1e67630c0868cf52a5c585b54a99e06f6b453"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "dab042579be3ff1774df337d015925d8",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 37348,
"upload_time": "2024-04-14T11:38:31",
"upload_time_iso_8601": "2024-04-14T11:38:31.158936Z",
"url": "https://files.pythonhosted.org/packages/8f/e4/02e2a076c83f507851885df18424a74dfd88bd4c11d39ddf51c13a555d15/frozendict-2.4.2-cp38-cp38-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2797efbb98ae75d3a03b24dd7b58897f9ecc4e83e006f62c1520586f5c2fa9e3",
"md5": "8812b687dff0c1cfa3b61306f0ff2c03",
"sha256": "84c36bfa819cd8442f6e0bdb86413c7678b2822a46b1a22cfa0f0dd30d9e5c45"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "8812b687dff0c1cfa3b61306f0ff2c03",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 37232,
"upload_time": "2024-04-14T11:38:33",
"upload_time_iso_8601": "2024-04-14T11:38:33.297826Z",
"url": "https://files.pythonhosted.org/packages/27/97/efbb98ae75d3a03b24dd7b58897f9ecc4e83e006f62c1520586f5c2fa9e3/frozendict-2.4.2-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ad65c1678b10499070aa94dd731dfe52fe261c7c4b97fc140417da03b13f49ea",
"md5": "7273cbb15a65a53ecf5cc7896404cb9c",
"sha256": "cead3bfe70c90c634a9b76807c9d7e75e6c5666ec96fa2cea8e7412ccf22a1f8"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "7273cbb15a65a53ecf5cc7896404cb9c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 114624,
"upload_time": "2024-04-14T11:38:35",
"upload_time_iso_8601": "2024-04-14T11:38:35.619794Z",
"url": "https://files.pythonhosted.org/packages/ad/65/c1678b10499070aa94dd731dfe52fe261c7c4b97fc140417da03b13f49ea/frozendict-2.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "89608e8e886b28eff8f54eed723f84acd630e30e7c56c292edf738ad0aedad1a",
"md5": "e62c613d647eb0e5031e41ac82e2fdea",
"sha256": "3fc6e3158107b5431255978b954758b1041cc70a3b8e7657373110512eb528e3"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e62c613d647eb0e5031e41ac82e2fdea",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 114546,
"upload_time": "2024-04-14T11:38:37",
"upload_time_iso_8601": "2024-04-14T11:38:37.814060Z",
"url": "https://files.pythonhosted.org/packages/89/60/8e8e886b28eff8f54eed723f84acd630e30e7c56c292edf738ad0aedad1a/frozendict-2.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f1d3729f3639799325fd7418c20d7b7435112786fe6838a1027ea8c389be2eb7",
"md5": "38e2334a78a168bda339b8bd7676c3e0",
"sha256": "4db1d6cc412bd865cab36723995208b82166a97bc6c724753bcd2b90cf24f164"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "38e2334a78a168bda339b8bd7676c3e0",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 119231,
"upload_time": "2024-04-14T11:38:39",
"upload_time_iso_8601": "2024-04-14T11:38:39.556160Z",
"url": "https://files.pythonhosted.org/packages/f1/d3/729f3639799325fd7418c20d7b7435112786fe6838a1027ea8c389be2eb7/frozendict-2.4.2-cp38-cp38-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c34b7421fa174db29d82a2f5519f2fb0a8f8ce0f19e91dea18e047e2f2003724",
"md5": "c733d22efbe6bf5ce36f4fe6912023c5",
"sha256": "ff6fb5831539fffb09d71cc0cc0462b1f27c0160cb6c6fa2d1f4c1bc7fffe52a"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "c733d22efbe6bf5ce36f4fe6912023c5",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 118089,
"upload_time": "2024-04-14T11:38:41",
"upload_time_iso_8601": "2024-04-14T11:38:41.830116Z",
"url": "https://files.pythonhosted.org/packages/c3/4b/7421fa174db29d82a2f5519f2fb0a8f8ce0f19e91dea18e047e2f2003724/frozendict-2.4.2-cp38-cp38-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fad2646a5bf6ea0dd452097249e7d400b867f2d65ffdb6a1b23e816ca1888c5e",
"md5": "3b13802e9f0f3e33df3af83519a24259",
"sha256": "79e1c94ad2a925ad5723d82a4134c6d851d5a7bc72b7e9da8b2087c42758a512"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "3b13802e9f0f3e33df3af83519a24259",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 36656,
"upload_time": "2024-04-14T11:38:43",
"upload_time_iso_8601": "2024-04-14T11:38:43.962701Z",
"url": "https://files.pythonhosted.org/packages/fa/d2/646a5bf6ea0dd452097249e7d400b867f2d65ffdb6a1b23e816ca1888c5e/frozendict-2.4.2-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "84c4b4cf488dedc95834218bd10056eb4f0e8bff5460639baf6fb8b784926077",
"md5": "4755c4f04d3ae8b75b59faf723a9d27b",
"sha256": "34704f9ffb21448d4b5c0f9239f8f058c0efab4bfdbe2956c5be978fef0b929c"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "4755c4f04d3ae8b75b59faf723a9d27b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 37767,
"upload_time": "2024-04-14T11:38:46",
"upload_time_iso_8601": "2024-04-14T11:38:46.106003Z",
"url": "https://files.pythonhosted.org/packages/84/c4/b4cf488dedc95834218bd10056eb4f0e8bff5460639baf6fb8b784926077/frozendict-2.4.2-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0df1cec8f0398b74b301dd15fc72bbf09dbbb4404413788405503080787f9f5a",
"md5": "f3b3ff669163b464f0894fd2c46e02a8",
"sha256": "5280d685cd1659883a3010dec843afe3065416ae92e453498997d4474a898a39"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f3b3ff669163b464f0894fd2c46e02a8",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 37537,
"upload_time": "2024-04-14T11:38:48",
"upload_time_iso_8601": "2024-04-14T11:38:48.103464Z",
"url": "https://files.pythonhosted.org/packages/0d/f1/cec8f0398b74b301dd15fc72bbf09dbbb4404413788405503080787f9f5a/frozendict-2.4.2-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "54286de653b47418b44501f021b1f9c3340bb606d1aea5336613b3321d56c9bc",
"md5": "aca0f36c4ba5bfd45d5fa57536e6463f",
"sha256": "4ca09a376114172e4d9918e6d576f58244c45e21f5af1245085699fd3a171c47"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "aca0f36c4ba5bfd45d5fa57536e6463f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 116438,
"upload_time": "2024-04-14T11:38:49",
"upload_time_iso_8601": "2024-04-14T11:38:49.849067Z",
"url": "https://files.pythonhosted.org/packages/54/28/6de653b47418b44501f021b1f9c3340bb606d1aea5336613b3321d56c9bc/frozendict-2.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e09dbf4885cefaa681202b6d0d5f75df45e9190aad86b16f0c0ccec7b4e3778b",
"md5": "08a97cec5522cc15bcebf00010841c32",
"sha256": "55953aa2acf5bf183c664f3d0f540f8c8ac8f5fa97170f2098d413414318eb2b"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "08a97cec5522cc15bcebf00010841c32",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 116230,
"upload_time": "2024-04-14T11:38:52",
"upload_time_iso_8601": "2024-04-14T11:38:52.261571Z",
"url": "https://files.pythonhosted.org/packages/e0/9d/bf4885cefaa681202b6d0d5f75df45e9190aad86b16f0c0ccec7b4e3778b/frozendict-2.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6daa3c21edb5a1d484a897ce27c095b41ffec900ac81b5b17b17bb8d3c7af703",
"md5": "0d8b4fcae6f6ae585bdecb40975b8fb9",
"sha256": "476e4857e1d87b05c9102dd5409216ce4716cb7df619e6657429bc99279303cc"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "0d8b4fcae6f6ae585bdecb40975b8fb9",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 118121,
"upload_time": "2024-04-14T11:38:53",
"upload_time_iso_8601": "2024-04-14T11:38:53.792966Z",
"url": "https://files.pythonhosted.org/packages/6d/aa/3c21edb5a1d484a897ce27c095b41ffec900ac81b5b17b17bb8d3c7af703/frozendict-2.4.2-cp39-cp39-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d4d070348f0a90bebac2a6567f9ee7470a175ae29c039a77e8494b874ef95d69",
"md5": "1c247652ba81ec12051304cfb6f31270",
"sha256": "4a8b298f39242d25770d029588ce9d4f524e9f4edc60d2d34b6178fb07c8a93e"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "1c247652ba81ec12051304cfb6f31270",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 117280,
"upload_time": "2024-04-14T11:38:55",
"upload_time_iso_8601": "2024-04-14T11:38:55.629805Z",
"url": "https://files.pythonhosted.org/packages/d4/d0/70348f0a90bebac2a6567f9ee7470a175ae29c039a77e8494b874ef95d69/frozendict-2.4.2-cp39-cp39-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a2349da865368854f93ae27712581acc6268245b33be65e4b8700267d4cd7365",
"md5": "1661414581d83d859e9f864cb9a8d2b7",
"sha256": "c157b8a92743a7905b341edb0663044fecdc7780f96c59a2843d3da68d694b90"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "1661414581d83d859e9f864cb9a8d2b7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 36986,
"upload_time": "2024-04-14T11:38:57",
"upload_time_iso_8601": "2024-04-14T11:38:57.111826Z",
"url": "https://files.pythonhosted.org/packages/a2/34/9da865368854f93ae27712581acc6268245b33be65e4b8700267d4cd7365/frozendict-2.4.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "963fa4e8c6c5f0867297f41d02821a5b9aed58dd82668ab9d9b2c4a016589adc",
"md5": "1e03dcadf5c562563ad652163250a371",
"sha256": "cbab325c0a98b2f3ee291b36710623781b4977a3057f9103a7b0f11bcc23b177"
},
"downloads": -1,
"filename": "frozendict-2.4.2-cp39-cp39-win_arm64.whl",
"has_sig": false,
"md5_digest": "1e03dcadf5c562563ad652163250a371",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 33680,
"upload_time": "2024-04-14T11:38:58",
"upload_time_iso_8601": "2024-04-14T11:38:58.635272Z",
"url": "https://files.pythonhosted.org/packages/96/3f/a4e8c6c5f0867297f41d02821a5b9aed58dd82668ab9d9b2c4a016589adc/frozendict-2.4.2-cp39-cp39-win_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c7e4e2a3d029f923b0b8796b57cf0def34f7ed9071557dbfde15bd4331bc3e08",
"md5": "347be2d5f0f4a3b90bd548f416e85425",
"sha256": "741779e1d1a2e6bb2c623f78423bd5d14aad35dc0c57e6ccc89e54eaab5f1b8a"
},
"downloads": -1,
"filename": "frozendict-2.4.2.tar.gz",
"has_sig": false,
"md5_digest": "347be2d5f0f4a3b90bd548f416e85425",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 315251,
"upload_time": "2024-04-14T11:39:00",
"upload_time_iso_8601": "2024-04-14T11:39:00.958676Z",
"url": "https://files.pythonhosted.org/packages/c7/e4/e2a3d029f923b0b8796b57cf0def34f7ed9071557dbfde15bd4331bc3e08/frozendict-2.4.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-14 11:39:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Marco-Sulla",
"github_project": "python-frozendict",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "frozendict"
}