frozendict


Namefrozendict JSON
Version 2.4.6 PyPI version JSON
download
home_pagehttps://github.com/Marco-Sulla/python-frozendict
SummaryA simple immutable dictionary
upload_time2024-10-13 12:15:32
maintainerNone
docs_urlNone
authorMarco Sulla
requires_python>=3.6
licenseLGPL v3
keywords immutable hashable picklable frozendict dict dictionary map mapping mappingproxytype developers stable utility
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.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.6",
    "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": "a67fe80cdbe0db930b2ba9d46ca35a41b0150156da16dfb79edcc05642690c3b",
                "md5": "856452aa962c19bb5de999088dbab8d6",
                "sha256": "c3a05c0a50cab96b4bb0ea25aa752efbfceed5ccb24c007612bc63e51299336f"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "856452aa962c19bb5de999088dbab8d6",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 37927,
            "upload_time": "2024-10-13T12:14:17",
            "upload_time_iso_8601": "2024-10-13T12:14:17.927963Z",
            "url": "https://files.pythonhosted.org/packages/a6/7f/e80cdbe0db930b2ba9d46ca35a41b0150156da16dfb79edcc05642690c3b/frozendict-2.4.6-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "299827e145ff7e8e63caa95fb8ee4fc56c68acb208bef01a89c3678a66f9a34d",
                "md5": "e472504a68757ca283595dd01b9da451",
                "sha256": "f5b94d5b07c00986f9e37a38dd83c13f5fe3bf3f1ccc8e88edea8fe15d6cd88c"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e472504a68757ca283595dd01b9da451",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 37945,
            "upload_time": "2024-10-13T12:14:19",
            "upload_time_iso_8601": "2024-10-13T12:14:19.976346Z",
            "url": "https://files.pythonhosted.org/packages/29/98/27e145ff7e8e63caa95fb8ee4fc56c68acb208bef01a89c3678a66f9a34d/frozendict-2.4.6-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "acf1a10be024a9d53441c997b3661ea80ecba6e3130adc53812a4b95b607cdd1",
                "md5": "9358015dc1ccc8fccabbe91bc5fd84f8",
                "sha256": "f4c789fd70879ccb6289a603cdebdc4953e7e5dea047d30c1b180529b28257b5"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "9358015dc1ccc8fccabbe91bc5fd84f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 117656,
            "upload_time": "2024-10-13T12:14:22",
            "upload_time_iso_8601": "2024-10-13T12:14:22.038221Z",
            "url": "https://files.pythonhosted.org/packages/ac/f1/a10be024a9d53441c997b3661ea80ecba6e3130adc53812a4b95b607cdd1/frozendict-2.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "46a634c760975e6f1cb4db59a990d58dcf22287e10241c851804670c74c6a27a",
                "md5": "dce3364c5ece165231ba6832de4fd477",
                "sha256": "da6a10164c8a50b34b9ab508a9420df38f4edf286b9ca7b7df8a91767baecb34"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "dce3364c5ece165231ba6832de4fd477",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 117444,
            "upload_time": "2024-10-13T12:14:24",
            "upload_time_iso_8601": "2024-10-13T12:14:24.251059Z",
            "url": "https://files.pythonhosted.org/packages/46/a6/34c760975e6f1cb4db59a990d58dcf22287e10241c851804670c74c6a27a/frozendict-2.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "62dd64bddd1ffa9617f50e7e63656b2a7ad7f0a46c86b5f4a3d2c714d0006277",
                "md5": "35e7679d2c2616e5036f87452e936c59",
                "sha256": "9a8a43036754a941601635ea9c788ebd7a7efbed2becba01b54a887b41b175b9"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "35e7679d2c2616e5036f87452e936c59",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 116801,
            "upload_time": "2024-10-13T12:14:26",
            "upload_time_iso_8601": "2024-10-13T12:14:26.518486Z",
            "url": "https://files.pythonhosted.org/packages/62/dd/64bddd1ffa9617f50e7e63656b2a7ad7f0a46c86b5f4a3d2c714d0006277/frozendict-2.4.6-cp310-cp310-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "45aeaf06a8bde1947277aad895c2f26c3b8b8b6ee9c0c2ad988fb58a9d1dde3f",
                "md5": "f64aac5d2c6da2603c44ca2c4ed72b50",
                "sha256": "c9905dcf7aa659e6a11b8051114c9fa76dfde3a6e50e6dc129d5aece75b449a2"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f64aac5d2c6da2603c44ca2c4ed72b50",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 117329,
            "upload_time": "2024-10-13T12:14:28",
            "upload_time_iso_8601": "2024-10-13T12:14:28.485621Z",
            "url": "https://files.pythonhosted.org/packages/45/ae/af06a8bde1947277aad895c2f26c3b8b8b6ee9c0c2ad988fb58a9d1dde3f/frozendict-2.4.6-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d2dfbe3fa0457ff661301228f4c59c630699568c8ed9b5480f113b3eea7d0cb3",
                "md5": "d38f8b5fe498bad0771861bf1efce7d2",
                "sha256": "323f1b674a2cc18f86ab81698e22aba8145d7a755e0ac2cccf142ee2db58620d"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d38f8b5fe498bad0771861bf1efce7d2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 37522,
            "upload_time": "2024-10-13T12:14:30",
            "upload_time_iso_8601": "2024-10-13T12:14:30.418164Z",
            "url": "https://files.pythonhosted.org/packages/d2/df/be3fa0457ff661301228f4c59c630699568c8ed9b5480f113b3eea7d0cb3/frozendict-2.4.6-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4a6fc22e0266b4c85f58b4613fec024e040e93753880527bf92b0c1bc228c27c",
                "md5": "1a0ed0109a9a7146df3723d9803b2d14",
                "sha256": "eabd21d8e5db0c58b60d26b4bb9839cac13132e88277e1376970172a85ee04b3"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp310-cp310-win_arm64.whl",
            "has_sig": false,
            "md5_digest": "1a0ed0109a9a7146df3723d9803b2d14",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.6",
            "size": 34056,
            "upload_time": "2024-10-13T12:14:31",
            "upload_time_iso_8601": "2024-10-13T12:14:31.757086Z",
            "url": "https://files.pythonhosted.org/packages/4a/6f/c22e0266b4c85f58b4613fec024e040e93753880527bf92b0c1bc228c27c/frozendict-2.4.6-cp310-cp310-win_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f8a0c5418356ba9944f98257fb69ae3a1bf39beb0cd54a5c4d2f0b6e2601ca5a",
                "md5": "36f2a70684eb6a9c7cea147d304365de",
                "sha256": "eddabeb769fab1e122d3a6872982c78179b5bcc909fdc769f3cf1964f55a6d20"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp36-cp36m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "36f2a70684eb6a9c7cea147d304365de",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 37162,
            "upload_time": "2024-10-13T12:14:33",
            "upload_time_iso_8601": "2024-10-13T12:14:33.803168Z",
            "url": "https://files.pythonhosted.org/packages/f8/a0/c5418356ba9944f98257fb69ae3a1bf39beb0cd54a5c4d2f0b6e2601ca5a/frozendict-2.4.6-cp36-cp36m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3789129e06fbf53c4d5f11f48a1f76d143135a2496d52c2470cc2112b0d13927",
                "md5": "9148531832f7ac62fe2e340879622293",
                "sha256": "377a65be0a700188fc21e669c07de60f4f6d35fae8071c292b7df04776a1c27b"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "9148531832f7ac62fe2e340879622293",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 102101,
            "upload_time": "2024-10-13T12:14:35",
            "upload_time_iso_8601": "2024-10-13T12:14:35.641477Z",
            "url": "https://files.pythonhosted.org/packages/37/89/129e06fbf53c4d5f11f48a1f76d143135a2496d52c2470cc2112b0d13927/frozendict-2.4.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "61b99f998103c0c5079963e2954f5ed903c419bd29a4d4e7fdbce1c28ae8e7da",
                "md5": "5e09f550e381ca22da3f93367c7c6434",
                "sha256": "ce1e9217b85eec6ba9560d520d5089c82dbb15f977906eb345d81459723dd7e3"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5e09f550e381ca22da3f93367c7c6434",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 101914,
            "upload_time": "2024-10-13T12:14:37",
            "upload_time_iso_8601": "2024-10-13T12:14:37.798180Z",
            "url": "https://files.pythonhosted.org/packages/61/b9/9f998103c0c5079963e2954f5ed903c419bd29a4d4e7fdbce1c28ae8e7da/frozendict-2.4.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a7697a9da3e136aaa99010ab96bfdc11078408f40d0b1368948aea7925603726",
                "md5": "1d13376059247eda1534aff5eaa3d7b7",
                "sha256": "7291abacf51798d5ffe632771a69c14fb423ab98d63c4ccd1aa382619afe2f89"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp36-cp36m-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "1d13376059247eda1534aff5eaa3d7b7",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 101178,
            "upload_time": "2024-10-13T12:14:39",
            "upload_time_iso_8601": "2024-10-13T12:14:39.987591Z",
            "url": "https://files.pythonhosted.org/packages/a7/69/7a9da3e136aaa99010ab96bfdc11078408f40d0b1368948aea7925603726/frozendict-2.4.6-cp36-cp36m-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "358d188de638697d5811f118e02b4c23270c77239e5eac949d8a79bc87bb90c8",
                "md5": "73bb0ab135b725865cbbdb5526b3c7a5",
                "sha256": "e72fb86e48811957d66ffb3e95580af7b1af1e6fbd760ad63d7bd79b2c9a07f8"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp36-cp36m-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "73bb0ab135b725865cbbdb5526b3c7a5",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 101013,
            "upload_time": "2024-10-13T12:14:42",
            "upload_time_iso_8601": "2024-10-13T12:14:42.100823Z",
            "url": "https://files.pythonhosted.org/packages/35/8d/188de638697d5811f118e02b4c23270c77239e5eac949d8a79bc87bb90c8/frozendict-2.4.6-cp36-cp36m-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2fe9fdc17d4704ec6f73aca508c8ea9f10462d4baf69c1b9aa1d3c2a9f1a6616",
                "md5": "d58b3a0b3b60fdce8a695fc6b9641557",
                "sha256": "622301b1c29c4f9bba633667d592a3a2b093cb408ba3ce578b8901ace3931ef3"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp36-cp36m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d58b3a0b3b60fdce8a695fc6b9641557",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=3.6",
            "size": 39192,
            "upload_time": "2024-10-13T12:14:43",
            "upload_time_iso_8601": "2024-10-13T12:14:43.834990Z",
            "url": "https://files.pythonhosted.org/packages/2f/e9/fdc17d4704ec6f73aca508c8ea9f10462d4baf69c1b9aa1d3c2a9f1a6616/frozendict-2.4.6-cp36-cp36m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fa128a21227459b3cff6ed44afd4e4556dc5d8d17fa1b5d7b7a10519a2c39c3b",
                "md5": "26df2ddefe2bee9cba0f6db87e3ce3d8",
                "sha256": "a4e3737cb99ed03200cd303bdcd5514c9f34b29ee48f405c1184141bd68611c9"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp37-cp37m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "26df2ddefe2bee9cba0f6db87e3ce3d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 37430,
            "upload_time": "2024-10-13T12:14:45",
            "upload_time_iso_8601": "2024-10-13T12:14:45.683311Z",
            "url": "https://files.pythonhosted.org/packages/fa/12/8a21227459b3cff6ed44afd4e4556dc5d8d17fa1b5d7b7a10519a2c39c3b/frozendict-2.4.6-cp37-cp37m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1b13b20538f72b88221b597a10952a160861376b6c328c243326d43b63003c8f",
                "md5": "77618ed8800cb72c436715227d7470b4",
                "sha256": "49ffaf09241bc1417daa19362a2241a4aa435f758fd4375c39ce9790443a39cd"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "77618ed8800cb72c436715227d7470b4",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 103892,
            "upload_time": "2024-10-13T12:14:47",
            "upload_time_iso_8601": "2024-10-13T12:14:47.927402Z",
            "url": "https://files.pythonhosted.org/packages/1b/13/b20538f72b88221b597a10952a160861376b6c328c243326d43b63003c8f/frozendict-2.4.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "291755b784e247322c782fdec40c658bf201322938dd715e7ed289dcc512cd18",
                "md5": "6a91295fde89878fa0ccfbbc7f3a19c4",
                "sha256": "2d69418479bfb834ba75b0e764f058af46ceee3d655deb6a0dd0c0c1a5e82f09"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6a91295fde89878fa0ccfbbc7f3a19c4",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 103792,
            "upload_time": "2024-10-13T12:14:50",
            "upload_time_iso_8601": "2024-10-13T12:14:50.086146Z",
            "url": "https://files.pythonhosted.org/packages/29/17/55b784e247322c782fdec40c658bf201322938dd715e7ed289dcc512cd18/frozendict-2.4.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7d1f4788d4803e4cee66861df2a4244c42ba5e2edc94faa4ad71d915a53b833c",
                "md5": "85dbafaf05fb1f1832c4b8cc8dd29818",
                "sha256": "c131f10c4d3906866454c4e89b87a7e0027d533cce8f4652aa5255112c4d6677"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp37-cp37m-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "85dbafaf05fb1f1832c4b8cc8dd29818",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 102604,
            "upload_time": "2024-10-13T12:14:52",
            "upload_time_iso_8601": "2024-10-13T12:14:52.338932Z",
            "url": "https://files.pythonhosted.org/packages/7d/1f/4788d4803e4cee66861df2a4244c42ba5e2edc94faa4ad71d915a53b833c/frozendict-2.4.6-cp37-cp37m-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b3696afbcc2e4d7157f792cd126a3b266aa2ee830d6492f494b6c77cd035bb33",
                "md5": "7ecc70bc405c6cf98b5fdf309807f0a1",
                "sha256": "fc67cbb3c96af7a798fab53d52589752c1673027e516b702ab355510ddf6bdff"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp37-cp37m-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7ecc70bc405c6cf98b5fdf309807f0a1",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 102848,
            "upload_time": "2024-10-13T12:14:54",
            "upload_time_iso_8601": "2024-10-13T12:14:54.700826Z",
            "url": "https://files.pythonhosted.org/packages/b3/69/6afbcc2e4d7157f792cd126a3b266aa2ee830d6492f494b6c77cd035bb33/frozendict-2.4.6-cp37-cp37m-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1050dd2b445de87aad6ae345f905bfc59fd7276a6071ea6f66af34f8e9278dd9",
                "md5": "d566fddc84ad33ca0c870c4ce9d25053",
                "sha256": "7730f8ebe791d147a1586cbf6a42629351d4597773317002181b66a2da0d509e"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d566fddc84ad33ca0c870c4ce9d25053",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.6",
            "size": 37397,
            "upload_time": "2024-10-13T12:14:56",
            "upload_time_iso_8601": "2024-10-13T12:14:56.800985Z",
            "url": "https://files.pythonhosted.org/packages/10/50/dd2b445de87aad6ae345f905bfc59fd7276a6071ea6f66af34f8e9278dd9/frozendict-2.4.6-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "983ae33b94dcca772c32837584fc976d153e8128d5a981af769a741ff8bcb622",
                "md5": "fb4d12e42d6de7080f7e72f29d102dd8",
                "sha256": "807862e14b0e9665042458fde692c4431d660c4219b9bb240817f5b918182222"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fb4d12e42d6de7080f7e72f29d102dd8",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 37701,
            "upload_time": "2024-10-13T12:14:58",
            "upload_time_iso_8601": "2024-10-13T12:14:58.372599Z",
            "url": "https://files.pythonhosted.org/packages/98/3a/e33b94dcca772c32837584fc976d153e8128d5a981af769a741ff8bcb622/frozendict-2.4.6-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1dcccae210676924a52cae0ae1541b6991bbb4485b144b7be67f645626be7d61",
                "md5": "c8e3c9669c51fe2dc4c182a14cb16d6f",
                "sha256": "9647c74efe3d845faa666d4853cfeabbaee403b53270cabfc635b321f770e6b8"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c8e3c9669c51fe2dc4c182a14cb16d6f",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 37587,
            "upload_time": "2024-10-13T12:15:00",
            "upload_time_iso_8601": "2024-10-13T12:15:00.017189Z",
            "url": "https://files.pythonhosted.org/packages/1d/cc/cae210676924a52cae0ae1541b6991bbb4485b144b7be67f645626be7d61/frozendict-2.4.6-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "96f6b52a9d738e7d652f1b049592d97cb77a47e1b9bc63ba7a57c53a56ff69b5",
                "md5": "4fb40f1b2784f779186de6cade563360",
                "sha256": "665fad3f0f815aa41294e561d98dbedba4b483b3968e7e8cab7d728d64b96e33"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "4fb40f1b2784f779186de6cade563360",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 115275,
            "upload_time": "2024-10-13T12:15:01",
            "upload_time_iso_8601": "2024-10-13T12:15:01.812838Z",
            "url": "https://files.pythonhosted.org/packages/96/f6/b52a9d738e7d652f1b049592d97cb77a47e1b9bc63ba7a57c53a56ff69b5/frozendict-2.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e2b95b850c5ae355829f855001966f573d1664ff0049fb6d974b9f4dfb406f92",
                "md5": "44de87ad024206418a518cc1df624b3d",
                "sha256": "1f42e6b75254ea2afe428ad6d095b62f95a7ae6d4f8272f0bd44a25dddd20f67"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "44de87ad024206418a518cc1df624b3d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 115201,
            "upload_time": "2024-10-13T12:15:04",
            "upload_time_iso_8601": "2024-10-13T12:15:04.205754Z",
            "url": "https://files.pythonhosted.org/packages/e2/b9/5b850c5ae355829f855001966f573d1664ff0049fb6d974b9f4dfb406f92/frozendict-2.4.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b964dc6f6e7cfb6a37c45bbccfc2805ec57700fad8a12f565323b2f6e5419cf8",
                "md5": "1ee88cfa0af9d625bfa28bf9e0ef15c1",
                "sha256": "02331541611f3897f260900a1815b63389654951126e6e65545e529b63c08361"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "1ee88cfa0af9d625bfa28bf9e0ef15c1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 114783,
            "upload_time": "2024-10-13T12:15:06",
            "upload_time_iso_8601": "2024-10-13T12:15:06.762600Z",
            "url": "https://files.pythonhosted.org/packages/b9/64/dc6f6e7cfb6a37c45bbccfc2805ec57700fad8a12f565323b2f6e5419cf8/frozendict-2.4.6-cp38-cp38-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4dc820048e682f11443303cee28cd4fe761f6f38ceddfce92db558496df5c4a8",
                "md5": "7f2e0174221e07fd7f8e8381316bee05",
                "sha256": "18d50a2598350b89189da9150058191f55057581e40533e470db46c942373acf"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7f2e0174221e07fd7f8e8381316bee05",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 115524,
            "upload_time": "2024-10-13T12:15:08",
            "upload_time_iso_8601": "2024-10-13T12:15:08.936156Z",
            "url": "https://files.pythonhosted.org/packages/4d/c8/20048e682f11443303cee28cd4fe761f6f38ceddfce92db558496df5c4a8/frozendict-2.4.6-cp38-cp38-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "979527b76d5019d3d5e02f2cad7dbc88647074379e170b168875007f2e9022df",
                "md5": "85ee70e3266bf6a4b04072704aedc607",
                "sha256": "1b4a3f8f6dd51bee74a50995c39b5a606b612847862203dd5483b9cd91b0d36a"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "85ee70e3266bf6a4b04072704aedc607",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.6",
            "size": 37511,
            "upload_time": "2024-10-13T12:15:10",
            "upload_time_iso_8601": "2024-10-13T12:15:10.661641Z",
            "url": "https://files.pythonhosted.org/packages/97/95/27b76d5019d3d5e02f2cad7dbc88647074379e170b168875007f2e9022df/frozendict-2.4.6-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eb7e5d6e86b01742468e5265401529b60d4d24e4b61a751d24473a324da71b55",
                "md5": "9bc7a2c792f1160fe16e04b9ee234a23",
                "sha256": "a76cee5c4be2a5d1ff063188232fffcce05dde6fd5edd6afe7b75b247526490e"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9bc7a2c792f1160fe16e04b9ee234a23",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 38143,
            "upload_time": "2024-10-13T12:15:12",
            "upload_time_iso_8601": "2024-10-13T12:15:12.300424Z",
            "url": "https://files.pythonhosted.org/packages/eb/7e/5d6e86b01742468e5265401529b60d4d24e4b61a751d24473a324da71b55/frozendict-2.4.6-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "93d03d66be6d154e2bbb4d49445c557f722b248c019b70982654e2440f303671",
                "md5": "cadee2d6235151d141fb1033e9ad406b",
                "sha256": "ba5ef7328706db857a2bdb2c2a17b4cd37c32a19c017cff1bb7eeebc86b0f411"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "cadee2d6235151d141fb1033e9ad406b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 37954,
            "upload_time": "2024-10-13T12:15:13",
            "upload_time_iso_8601": "2024-10-13T12:15:13.734092Z",
            "url": "https://files.pythonhosted.org/packages/93/d0/3d66be6d154e2bbb4d49445c557f722b248c019b70982654e2440f303671/frozendict-2.4.6-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b8a25a178339345edff643240e48dd276581df64b1dd93eaa7d26556396a145b",
                "md5": "0885e370457b29e6f3a65e130820bb56",
                "sha256": "669237c571856be575eca28a69e92a3d18f8490511eff184937283dc6093bd67"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "0885e370457b29e6f3a65e130820bb56",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 117093,
            "upload_time": "2024-10-13T12:15:15",
            "upload_time_iso_8601": "2024-10-13T12:15:15.621918Z",
            "url": "https://files.pythonhosted.org/packages/b8/a2/5a178339345edff643240e48dd276581df64b1dd93eaa7d26556396a145b/frozendict-2.4.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "41df09a752239eb0661eeda0f34f14577c10edc6f3e4deb7652b3a3efff22ad4",
                "md5": "e30d2241e50f5c94b0058b3a348e72ab",
                "sha256": "0aaa11e7c472150efe65adbcd6c17ac0f586896096ab3963775e1c5c58ac0098"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e30d2241e50f5c94b0058b3a348e72ab",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 116883,
            "upload_time": "2024-10-13T12:15:17",
            "upload_time_iso_8601": "2024-10-13T12:15:17.521191Z",
            "url": "https://files.pythonhosted.org/packages/41/df/09a752239eb0661eeda0f34f14577c10edc6f3e4deb7652b3a3efff22ad4/frozendict-2.4.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "22d4619d1cfbc74be5641d839a5a2e292f9eac494aa557bfe7c266542c4014a2",
                "md5": "1e0873701efa2b7756d99cb46c6ad2f4",
                "sha256": "b8f2829048f29fe115da4a60409be2130e69402e29029339663fac39c90e6e2b"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "1e0873701efa2b7756d99cb46c6ad2f4",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 116314,
            "upload_time": "2024-10-13T12:15:19",
            "upload_time_iso_8601": "2024-10-13T12:15:19.689223Z",
            "url": "https://files.pythonhosted.org/packages/22/d4/619d1cfbc74be5641d839a5a2e292f9eac494aa557bfe7c266542c4014a2/frozendict-2.4.6-cp39-cp39-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "41b940042606a4ac458046ebeecc34cec2971e78e029ea3b6ad4e35833c7f8e6",
                "md5": "ee656ff49a6b5541d9e2790dfd7ac17f",
                "sha256": "94321e646cc39bebc66954a31edd1847d3a2a3483cf52ff051cd0996e7db07db"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ee656ff49a6b5541d9e2790dfd7ac17f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 117017,
            "upload_time": "2024-10-13T12:15:21",
            "upload_time_iso_8601": "2024-10-13T12:15:21.718291Z",
            "url": "https://files.pythonhosted.org/packages/41/b9/40042606a4ac458046ebeecc34cec2971e78e029ea3b6ad4e35833c7f8e6/frozendict-2.4.6-cp39-cp39-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e16de99715f406d8f4297d08b5591365e7d91b39a24cdbaabd3861f95e283c52",
                "md5": "944168c341e619fbf6febf6a36ba1c17",
                "sha256": "74b6b26c15dddfefddeb89813e455b00ebf78d0a3662b89506b4d55c6445a9f4"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "944168c341e619fbf6febf6a36ba1c17",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 37815,
            "upload_time": "2024-10-13T12:15:23",
            "upload_time_iso_8601": "2024-10-13T12:15:23.156730Z",
            "url": "https://files.pythonhosted.org/packages/e1/6d/e99715f406d8f4297d08b5591365e7d91b39a24cdbaabd3861f95e283c52/frozendict-2.4.6-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8075cad77ff4bb58277a557becf837345de8f6384d3b1d71f932d22a13223b9e",
                "md5": "b7f99dc39ca3717c148140e7d4dfedaa",
                "sha256": "7088102345d1606450bd1801a61139bbaa2cb0d805b9b692f8d81918ea835da6"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-cp39-cp39-win_arm64.whl",
            "has_sig": false,
            "md5_digest": "b7f99dc39ca3717c148140e7d4dfedaa",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.6",
            "size": 34368,
            "upload_time": "2024-10-13T12:15:25",
            "upload_time_iso_8601": "2024-10-13T12:15:25.001689Z",
            "url": "https://files.pythonhosted.org/packages/80/75/cad77ff4bb58277a557becf837345de8f6384d3b1d71f932d22a13223b9e/frozendict-2.4.6-cp39-cp39-win_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0413d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5",
                "md5": "88ceb812e4b4a3e78603836e324c720a",
                "sha256": "d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-py311-none-any.whl",
            "has_sig": false,
            "md5_digest": "88ceb812e4b4a3e78603836e324c720a",
            "packagetype": "bdist_wheel",
            "python_version": "py311",
            "requires_python": ">=3.6",
            "size": 16148,
            "upload_time": "2024-10-13T12:15:26",
            "upload_time_iso_8601": "2024-10-13T12:15:26.839498Z",
            "url": "https://files.pythonhosted.org/packages/04/13/d9839089b900fa7b479cce495d62110cddc4bd5630a04d8469916c0e79c5/frozendict-2.4.6-py311-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bad0d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250",
                "md5": "56852ae4de44fcd4e8da8d4d99b58aed",
                "sha256": "49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-py312-none-any.whl",
            "has_sig": false,
            "md5_digest": "56852ae4de44fcd4e8da8d4d99b58aed",
            "packagetype": "bdist_wheel",
            "python_version": "py312",
            "requires_python": ">=3.6",
            "size": 16146,
            "upload_time": "2024-10-13T12:15:28",
            "upload_time_iso_8601": "2024-10-13T12:15:28.160806Z",
            "url": "https://files.pythonhosted.org/packages/ba/d0/d482c39cee2ab2978a892558cf130681d4574ea208e162da8958b31e9250/frozendict-2.4.6-py312-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a58eb6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2",
                "md5": "5e514d190d14a7229656eec409931acb",
                "sha256": "7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6-py313-none-any.whl",
            "has_sig": false,
            "md5_digest": "5e514d190d14a7229656eec409931acb",
            "packagetype": "bdist_wheel",
            "python_version": "py313",
            "requires_python": ">=3.6",
            "size": 16146,
            "upload_time": "2024-10-13T12:15:29",
            "upload_time_iso_8601": "2024-10-13T12:15:29.495634Z",
            "url": "https://files.pythonhosted.org/packages/a5/8e/b6bf6a0de482d7d7d7a2aaac8fdc4a4d0bb24a809f5ddd422aa7060eb3d2/frozendict-2.4.6-py313-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bb5919eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e",
                "md5": "2b9a6bfdfa4de419e1f32dae6b51e54a",
                "sha256": "df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e"
            },
            "downloads": -1,
            "filename": "frozendict-2.4.6.tar.gz",
            "has_sig": false,
            "md5_digest": "2b9a6bfdfa4de419e1f32dae6b51e54a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 316416,
            "upload_time": "2024-10-13T12:15:32",
            "upload_time_iso_8601": "2024-10-13T12:15:32.449434Z",
            "url": "https://files.pythonhosted.org/packages/bb/59/19eb300ba28e7547538bdf603f1c6c34793240a90e1a7b61b65d8517e35e/frozendict-2.4.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-13 12:15:32",
    "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"
}
        
Elapsed time: 8.06683s