# 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 a 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 a 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/8a/d5/3b155f70b795802802447070c5db7c86ad0a14ff2c20447ebedc97490b75/frozendict-2.4.3.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 a 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 a 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.3",
"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": "2fec7e60107101cde8b2d2f9d56713b10b2803d90526481d7c473e55393c1a98",
"md5": "6d32f76309e5957f26e751f1628f2876",
"sha256": "8295584b3e6cdde2033405ab467c1fe28d68f50beb82b716e3b68fd0c4d1e6c5"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "6d32f76309e5957f26e751f1628f2876",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 37826,
"upload_time": "2024-05-05T14:49:38",
"upload_time_iso_8601": "2024-05-05T14:49:38.150265Z",
"url": "https://files.pythonhosted.org/packages/2f/ec/7e60107101cde8b2d2f9d56713b10b2803d90526481d7c473e55393c1a98/frozendict-2.4.3-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "27b6593794317a104ce235ab3db7c987fc3d7eccdb0dcd1f1dc3195cfcd8dac9",
"md5": "3823b2bbde413ec7448062d7032c8a4c",
"sha256": "e6fb13829ebcdbfdcf09ab464717e74d94fd66ade23e423ccf3b92922b5645b0"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "3823b2bbde413ec7448062d7032c8a4c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 117525,
"upload_time": "2024-05-05T14:49:40",
"upload_time_iso_8601": "2024-05-05T14:49:40.954593Z",
"url": "https://files.pythonhosted.org/packages/27/b6/593794317a104ce235ab3db7c987fc3d7eccdb0dcd1f1dc3195cfcd8dac9/frozendict-2.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9baa6ffc3f287669f54c6e02d4deeab6989dab9134d610372ad14bd12ec8fc74",
"md5": "7766fbf6f56302f494ddda646bd8f352",
"sha256": "3d30ca189dedd21ae16b4f596653b011e12fc459f31a5a2b3f2021d684cdd3bc"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "7766fbf6f56302f494ddda646bd8f352",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 117325,
"upload_time": "2024-05-05T14:49:43",
"upload_time_iso_8601": "2024-05-05T14:49:43.362657Z",
"url": "https://files.pythonhosted.org/packages/9b/aa/6ffc3f287669f54c6e02d4deeab6989dab9134d610372ad14bd12ec8fc74/frozendict-2.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4c3102fd5de708e1669422c327f26322529f346a66ceac1b4ccc59545ebb738c",
"md5": "4305af260834010e2e1e3f0a9fd13294",
"sha256": "f3afd54f0aad08cc3baaec9ecff57995008953e6a34cf78dc24ae0217d5bcd4c"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "4305af260834010e2e1e3f0a9fd13294",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 119175,
"upload_time": "2024-05-05T14:49:45",
"upload_time_iso_8601": "2024-05-05T14:49:45.038129Z",
"url": "https://files.pythonhosted.org/packages/4c/31/02fd5de708e1669422c327f26322529f346a66ceac1b4ccc59545ebb738c/frozendict-2.4.3-cp310-cp310-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "848346646ee4309ffd8881ff85cd2491b62aa359b2cb2216375710e5168dff2a",
"md5": "1461e293699e80681c7928637e6261c8",
"sha256": "3f930d5af0121be08235c6409f31c0a6e8e049af3b5ed9eb43cd7e688a362bae"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "1461e293699e80681c7928637e6261c8",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 118509,
"upload_time": "2024-05-05T14:49:46",
"upload_time_iso_8601": "2024-05-05T14:49:46.739879Z",
"url": "https://files.pythonhosted.org/packages/84/83/46646ee4309ffd8881ff85cd2491b62aa359b2cb2216375710e5168dff2a/frozendict-2.4.3-cp310-cp310-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5d1fa3332d4d89f756d312303a0a973615703c5a6d2ca1637fb9b275f018694e",
"md5": "4a0bdfff16c255c1be7d2a8ede034b35",
"sha256": "e7c2ebdca880dcc6161619428379ac21577735d594e319b0ea5cae3ae7e8e5ba"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "4a0bdfff16c255c1be7d2a8ede034b35",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 37254,
"upload_time": "2024-05-05T14:49:49",
"upload_time_iso_8601": "2024-05-05T14:49:49.553141Z",
"url": "https://files.pythonhosted.org/packages/5d/1f/a3332d4d89f756d312303a0a973615703c5a6d2ca1637fb9b275f018694e/frozendict-2.4.3-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5005c08ede0e4ceab8ad0ce7020e87bcf0f6d4c2ed64c35e4d6268fc0d99d8ba",
"md5": "a82c077dc5ccb72349c3a3bbfdaf2491",
"sha256": "abb89da4044e0e01d33da3de41392b51af6c6bb43e03aff6515d7d6aa38d5515"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp310-cp310-win_arm64.whl",
"has_sig": false,
"md5_digest": "a82c077dc5ccb72349c3a3bbfdaf2491",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.6",
"size": 33895,
"upload_time": "2024-05-05T14:49:52",
"upload_time_iso_8601": "2024-05-05T14:49:52.565066Z",
"url": "https://files.pythonhosted.org/packages/50/05/c08ede0e4ceab8ad0ce7020e87bcf0f6d4c2ed64c35e4d6268fc0d99d8ba/frozendict-2.4.3-cp310-cp310-win_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "209600055283fdfcfa56232ee4512da41903dc213f12774f5907945fbfc9b70d",
"md5": "b0077794bef65ca5b106da5f26dc47c3",
"sha256": "283dd1a5a815ae093aa265149c30ded5b3da9544a1894179ea21fdb35771fe48"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "b0077794bef65ca5b106da5f26dc47c3",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 101979,
"upload_time": "2024-05-05T14:49:54",
"upload_time_iso_8601": "2024-05-05T14:49:54.234179Z",
"url": "https://files.pythonhosted.org/packages/20/96/00055283fdfcfa56232ee4512da41903dc213f12774f5907945fbfc9b70d/frozendict-2.4.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9cce8822d76be8f0d6ae1de8971914a14afc5f10c38699e4344163781109a2e5",
"md5": "aac4d171dbcdad5ba735e0741e6c00e8",
"sha256": "a0f7d4b17485d1a13fe4efa6be4c9b9a9977208a68d4ef4b8b4be7578eaacabb"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "aac4d171dbcdad5ba735e0741e6c00e8",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 101790,
"upload_time": "2024-05-05T14:49:56",
"upload_time_iso_8601": "2024-05-05T14:49:56.555464Z",
"url": "https://files.pythonhosted.org/packages/9c/ce/8822d76be8f0d6ae1de8971914a14afc5f10c38699e4344163781109a2e5/frozendict-2.4.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dcc163fe80f6c978133c49bea562aff4a6d2f31ef749006a7a7899c6e37b0150",
"md5": "ecc4b46b35f2210ddf6495874adb8f62",
"sha256": "d7684df22e7ca8d2a27cc4806fb66da6ef63ffc7b825d0f20fceab91202fea64"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp36-cp36m-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "ecc4b46b35f2210ddf6495874adb8f62",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 104854,
"upload_time": "2024-05-05T14:49:58",
"upload_time_iso_8601": "2024-05-05T14:49:58.685044Z",
"url": "https://files.pythonhosted.org/packages/dc/c1/63fe80f6c978133c49bea562aff4a6d2f31ef749006a7a7899c6e37b0150/frozendict-2.4.3-cp36-cp36m-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "dbbcc8743d84d4bc4069daca3795ce6a09b0f08a7df1f4b45d615bebe803e7a9",
"md5": "7ad83f8791dbb83f7babad33aad62336",
"sha256": "f5c0f53db39d2ccf4b126983a0657ec67e41134e7fa43b424408291aa2804746"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp36-cp36m-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "7ad83f8791dbb83f7babad33aad62336",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 104332,
"upload_time": "2024-05-05T14:50:00",
"upload_time_iso_8601": "2024-05-05T14:50:00.968153Z",
"url": "https://files.pythonhosted.org/packages/db/bc/c8743d84d4bc4069daca3795ce6a09b0f08a7df1f4b45d615bebe803e7a9/frozendict-2.4.3-cp36-cp36m-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1bffe8c07d3e73796c7b2008b4308171cee55726303053484350f17553e554ce",
"md5": "c6fb0eace808b18c6c4e3d9d8cac44c4",
"sha256": "d4527d411d7d228c2907aeeb0e6bad87401571982a05a27d0f8334c64353c22c"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp36-cp36m-win_amd64.whl",
"has_sig": false,
"md5_digest": "c6fb0eace808b18c6c4e3d9d8cac44c4",
"packagetype": "bdist_wheel",
"python_version": "cp36",
"requires_python": ">=3.6",
"size": 38821,
"upload_time": "2024-05-05T14:50:04",
"upload_time_iso_8601": "2024-05-05T14:50:04.635387Z",
"url": "https://files.pythonhosted.org/packages/1b/ff/e8c07d3e73796c7b2008b4308171cee55726303053484350f17553e554ce/frozendict-2.4.3-cp36-cp36m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "09d27fff07c9940947c60cf3e2df31d4c18784e7f5904aad9fc6495e8afd2ead",
"md5": "6efcc6ad05ed973b890ff75d39d7b661",
"sha256": "904165b873897e2a0e3faf742570fcdaa57c403f86a2553f432c2498cd315f9f"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "6efcc6ad05ed973b890ff75d39d7b661",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 103768,
"upload_time": "2024-05-05T14:50:06",
"upload_time_iso_8601": "2024-05-05T14:50:06.393410Z",
"url": "https://files.pythonhosted.org/packages/09/d2/7fff07c9940947c60cf3e2df31d4c18784e7f5904aad9fc6495e8afd2ead/frozendict-2.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cff13536ec60c8112615767b7e2742d2862dd3c0a37a271a71936f8cec88fdea",
"md5": "5e135182f188bd84dfc2a84c545a9c9b",
"sha256": "4cb1eb811b43c3183482b09f9a5b9ed8662b213e57ca090692433bc234001ae5"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5e135182f188bd84dfc2a84c545a9c9b",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 103669,
"upload_time": "2024-05-05T14:50:08",
"upload_time_iso_8601": "2024-05-05T14:50:08.150962Z",
"url": "https://files.pythonhosted.org/packages/cf/f1/3536ec60c8112615767b7e2742d2862dd3c0a37a271a71936f8cec88fdea/frozendict-2.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "833b6d8e96c9c764f58721894c2c95ccee2a8de32769bb9de2c813ef70115b4e",
"md5": "9a574d1cf7ec9a3a953ac5435f006836",
"sha256": "ddcfc657058e71bf3641d749f2b22d2dd92cc25d58b232e8e2c2bc0fcf0b6fb4"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "9a574d1cf7ec9a3a953ac5435f006836",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 106463,
"upload_time": "2024-05-05T14:50:10",
"upload_time_iso_8601": "2024-05-05T14:50:10.116438Z",
"url": "https://files.pythonhosted.org/packages/83/3b/6d8e96c9c764f58721894c2c95ccee2a8de32769bb9de2c813ef70115b4e/frozendict-2.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2707532a31d99e29751680fc4c1589d0ecc310092213427d9edfdfb725f02f29",
"md5": "e8219dd78feac3ac4b9f88f8628111dc",
"sha256": "a64f6c6ccf201182edf003e27b25c790dc7d9ba1b94ae84f3060d969bc985810"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "e8219dd78feac3ac4b9f88f8628111dc",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 105971,
"upload_time": "2024-05-05T14:50:12",
"upload_time_iso_8601": "2024-05-05T14:50:12.582646Z",
"url": "https://files.pythonhosted.org/packages/27/07/532a31d99e29751680fc4c1589d0ecc310092213427d9edfdfb725f02f29/frozendict-2.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0aafcd371e211fd9a27534caeda5c4751044fb7dbb7b18e748869cf334b8c955",
"md5": "8878049439741b057faf400a34fcf887",
"sha256": "8153f09bd71800eb866626124b3fb54dae2fb6dbb342cb1d38485d8fe95bf61e"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "8878049439741b057faf400a34fcf887",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.6",
"size": 37074,
"upload_time": "2024-05-05T14:50:15",
"upload_time_iso_8601": "2024-05-05T14:50:15.593471Z",
"url": "https://files.pythonhosted.org/packages/0a/af/cd371e211fd9a27534caeda5c4751044fb7dbb7b18e748869cf334b8c955/frozendict-2.4.3-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "530d29304f25675d0a5b4b012a22a3bfb69ace885788236a50c9f759e5f066d5",
"md5": "1291b34c101b89226990d1525900b454",
"sha256": "24d520a2264b9eba37ea19ca6a5523bf0d8a0330d0902bf50f2d1817e6e8139c"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "1291b34c101b89226990d1525900b454",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 37469,
"upload_time": "2024-05-05T14:50:17",
"upload_time_iso_8601": "2024-05-05T14:50:17.287127Z",
"url": "https://files.pythonhosted.org/packages/53/0d/29304f25675d0a5b4b012a22a3bfb69ace885788236a50c9f759e5f066d5/frozendict-2.4.3-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "98d5675bc941c965cafb18ea3a7e32ec02b47d806dfc5bef0ef9ff4775b26156",
"md5": "a448a700c7f03387b30ff60e2acb3fe5",
"sha256": "3196a0c856bd4eb8e192d26a959ec10441c4116b6f9da336030b6975257c9daa"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "a448a700c7f03387b30ff60e2acb3fe5",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 115156,
"upload_time": "2024-05-05T14:50:19",
"upload_time_iso_8601": "2024-05-05T14:50:19.096482Z",
"url": "https://files.pythonhosted.org/packages/98/d5/675bc941c965cafb18ea3a7e32ec02b47d806dfc5bef0ef9ff4775b26156/frozendict-2.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1c4f3f276d947de22208a956ddbe48a6fdc1d346e0abf582d3eb51fe042193cc",
"md5": "e3f7439ca32db0099eaf27005a43ca22",
"sha256": "0a94e88e3f457fb9f4039890a756e157a0b5e5a005bcfe6367295f511193a319"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e3f7439ca32db0099eaf27005a43ca22",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 115074,
"upload_time": "2024-05-05T14:50:21",
"upload_time_iso_8601": "2024-05-05T14:50:21.232154Z",
"url": "https://files.pythonhosted.org/packages/1c/4f/3f276d947de22208a956ddbe48a6fdc1d346e0abf582d3eb51fe042193cc/frozendict-2.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5746838fe5b4264003f2edac59b2601e9ba7102b34c6fa6ba6be76b0f94eb33b",
"md5": "a348c0cbd6543262f47adce1278a3d90",
"sha256": "2f150aabd05655075e7bb47c0bb7d91765649e4729e91d1ac4b1512c1f785256"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp38-cp38-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "a348c0cbd6543262f47adce1278a3d90",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 119758,
"upload_time": "2024-05-05T14:50:24",
"upload_time_iso_8601": "2024-05-05T14:50:24.185118Z",
"url": "https://files.pythonhosted.org/packages/57/46/838fe5b4264003f2edac59b2601e9ba7102b34c6fa6ba6be76b0f94eb33b/frozendict-2.4.3-cp38-cp38-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3870bc98ebf93ed1096a485e9f58445bbb5a215b0e70e5f03efcfc8b75ab9613",
"md5": "d450f4ffaae693ffcc1303ec52b2edec",
"sha256": "d49c10ed8cdb678cd6d46367391bc3cde9e6b705ceba83c4bd58854557a9304a"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp38-cp38-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "d450f4ffaae693ffcc1303ec52b2edec",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 118617,
"upload_time": "2024-05-05T14:50:26",
"upload_time_iso_8601": "2024-05-05T14:50:26.451728Z",
"url": "https://files.pythonhosted.org/packages/38/70/bc98ebf93ed1096a485e9f58445bbb5a215b0e70e5f03efcfc8b75ab9613/frozendict-2.4.3-cp38-cp38-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bc659aa285c15878835d3482cb0bdc6d5d54ef04069b5730fada7cd1c8986e25",
"md5": "36169408c73821c0825c0eccf1a2b836",
"sha256": "dd4e6c888884c662f0074ac35b3e10a6ee3cccd2f550c489a4c03cbf70ece03e"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "36169408c73821c0825c0eccf1a2b836",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.6",
"size": 37196,
"upload_time": "2024-05-05T14:50:28",
"upload_time_iso_8601": "2024-05-05T14:50:28.152073Z",
"url": "https://files.pythonhosted.org/packages/bc/65/9aa285c15878835d3482cb0bdc6d5d54ef04069b5730fada7cd1c8986e25/frozendict-2.4.3-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "49095e196749bd4b70f430e40199635b1c5a2b116d21ae2e71bfffc0b1ab8f86",
"md5": "3eddc6c9341a58bfdc03b25afc8ed572",
"sha256": "98cb02ea3d0c1110f79ecedfce79903f0c915a9466180e09a847ed813be5e521"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "3eddc6c9341a58bfdc03b25afc8ed572",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 37832,
"upload_time": "2024-05-05T14:50:29",
"upload_time_iso_8601": "2024-05-05T14:50:29.785030Z",
"url": "https://files.pythonhosted.org/packages/49/09/5e196749bd4b70f430e40199635b1c5a2b116d21ae2e71bfffc0b1ab8f86/frozendict-2.4.3-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ea3e4c021178917c541f4e54df84da7e29a0905b2d41b1df02a8033f321866f3",
"md5": "9abab8641a409d037d59f45c63db0c7d",
"sha256": "4d2b1588b9913e8e281781ab78627961f566657e94eb23e95b0b6d47c531553a"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "9abab8641a409d037d59f45c63db0c7d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 116968,
"upload_time": "2024-05-05T14:50:31",
"upload_time_iso_8601": "2024-05-05T14:50:31.831147Z",
"url": "https://files.pythonhosted.org/packages/ea/3e/4c021178917c541f4e54df84da7e29a0905b2d41b1df02a8033f321866f3/frozendict-2.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6e965116c1960562821a467c789c8458e8941878c861ebd5484299fce2dc56df",
"md5": "a1c81e283926a187fa6142912e900dc2",
"sha256": "12a4af1c819c8bae63f72a56af1410e158ac674d492d8dcffd6001bdd022a6c3"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "a1c81e283926a187fa6142912e900dc2",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 116756,
"upload_time": "2024-05-05T14:50:33",
"upload_time_iso_8601": "2024-05-05T14:50:33.738615Z",
"url": "https://files.pythonhosted.org/packages/6e/96/5116c1960562821a467c789c8458e8941878c861ebd5484299fce2dc56df/frozendict-2.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "426522f1bf216f4a2afa89b28dbffad3369c6018963be1cef1f90eeba3366a2c",
"md5": "8860cdcb26afa9bbc4987265d3ddde9c",
"sha256": "55fd13532c5bcab80ab9543f2344f67c4d6a38a04c7b5bc5317a7d3b7e00c0d3"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "8860cdcb26afa9bbc4987265d3ddde9c",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 118648,
"upload_time": "2024-05-05T14:50:35",
"upload_time_iso_8601": "2024-05-05T14:50:35.588528Z",
"url": "https://files.pythonhosted.org/packages/42/65/22f1bf216f4a2afa89b28dbffad3369c6018963be1cef1f90eeba3366a2c/frozendict-2.4.3-cp39-cp39-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "51543dadac7eb60e2268ef5e9c9381bd0d8ab442ae6fa6f2bbeb5890b595699a",
"md5": "4b2dc087029bc86d69028df48769549b",
"sha256": "30c9eb3a599ed7624f03a3d9777503852c9d52a8b190c43225c5b6353bfca204"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "4b2dc087029bc86d69028df48769549b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 117804,
"upload_time": "2024-05-05T14:50:37",
"upload_time_iso_8601": "2024-05-05T14:50:37.613594Z",
"url": "https://files.pythonhosted.org/packages/51/54/3dadac7eb60e2268ef5e9c9381bd0d8ab442ae6fa6f2bbeb5890b595699a/frozendict-2.4.3-cp39-cp39-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d573d6728570540ba24aacda89ffd3503a64f4d2a74e300357f4c5cc8f9b9431",
"md5": "89eb81b72e332ca244411e8dd82520e3",
"sha256": "664c185cac890016cc629f556b8fa4aa1d1ff56f8b96e30cde25e5294d0713b5"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "89eb81b72e332ca244411e8dd82520e3",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 37526,
"upload_time": "2024-05-05T14:50:39",
"upload_time_iso_8601": "2024-05-05T14:50:39.206346Z",
"url": "https://files.pythonhosted.org/packages/d5/73/d6728570540ba24aacda89ffd3503a64f4d2a74e300357f4c5cc8f9b9431/frozendict-2.4.3-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2b00798eb717eea45fe957eb0326ee2b162c39c9c4450d28ba09cb6fd176f412",
"md5": "44ba639b6f41966d29f426e32b407f03",
"sha256": "27a8af898f82255fb65722791002796b9694a4c5480e6d12d6e7221530d8294a"
},
"downloads": -1,
"filename": "frozendict-2.4.3-cp39-cp39-win_arm64.whl",
"has_sig": false,
"md5_digest": "44ba639b6f41966d29f426e32b407f03",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.6",
"size": 34218,
"upload_time": "2024-05-05T14:50:41",
"upload_time_iso_8601": "2024-05-05T14:50:41.819120Z",
"url": "https://files.pythonhosted.org/packages/2b/00/798eb717eea45fe957eb0326ee2b162c39c9c4450d28ba09cb6fd176f412/frozendict-2.4.3-cp39-cp39-win_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8ad53b155f70b795802802447070c5db7c86ad0a14ff2c20447ebedc97490b75",
"md5": "25d3b48464d6df0496fa7ef4feee58ca",
"sha256": "3bb6831c099028b49551fc9852f6ed43a0b901cecb65f6d293141a139dfa971f"
},
"downloads": -1,
"filename": "frozendict-2.4.3.tar.gz",
"has_sig": false,
"md5_digest": "25d3b48464d6df0496fa7ef4feee58ca",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 315951,
"upload_time": "2024-05-05T14:50:43",
"upload_time_iso_8601": "2024-05-05T14:50:43.872444Z",
"url": "https://files.pythonhosted.org/packages/8a/d5/3b155f70b795802802447070c5db7c86ad0a14ff2c20447ebedc97490b75/frozendict-2.4.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-05 14:50:43",
"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"
}