frozendict


Namefrozendict JSON
Version 2.4.3 PyPI version JSON
download
home_pagehttps://github.com/Marco-Sulla/python-frozendict
SummaryA simple immutable dictionary
upload_time2024-05-05 14:50:43
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/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"
}
        
Elapsed time: 0.20529s