frozendict


Namefrozendict JSON
Version 2.4.2 PyPI version JSON
download
home_pagehttps://github.com/Marco-Sulla/python-frozendict
SummaryA simple immutable dictionary
upload_time2024-04-14 11:39:00
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 an hash, if all values 
are hashable.

You can also add any `dict` to a `frozendict` using the `|` operator. The result is a new `frozendict`.

# Install

You can install `frozendict` by simply typing in a command line:

```bash
pip install frozendict
```

The C Extension is optional by default from version 2.3.5. You can make it mandatory using:

```bash
CIBUILDWHEEL=1 pip install frozendict
```

On the contrary, if you want the pure py implementation:

```bash
FROZENDICT_PURE_PY=1 pip install frozendict
```

# API

## frozendict API
The API is the same of `dict` of Python 3.10, without the methods and operands which alter the map. Additionally, `frozendict` supports these methods:

### `__hash__()`

If all the values of the `frozendict` are hashable, returns an hash, otherwise raises a TypeError.

### `set(key, value)`

It returns a new `frozendict`. If key is already in the original `frozendict`, the new one will have it with the new value associated. Otherwise, the new `frozendict` will contain the new (key, value) item.

### `delete(key)`

It returns a new `frozendict` without the item corresponding to the key. If the key is not present, a KeyError is raised.

### `setdefault(key[, default])`

If key is already in `frozendict`, the object itself is returned unchanged. Otherwise, the new `frozendict` will contain the new (key, default) item. The parameter default defaults to None.

### `key([index])`

It returns the key at the specified index (determined by the insertion order). If index is not passed, it defaults to 0. If the index is negative, the position will be the size of the `frozendict` + index

### `value([index])`
Same as `key(index)`, but it returns the value at the given index.

### `item([index])`
Same as `key(index)`, but it returns a tuple with (key, value) at the given index.

## deepfreeze API

The `frozendict` _module_ has also these static methods:

### `frozendict.deepfreeze(o, custom_converters = None, custom_inverse_converters = None)`
Converts the object and all the objects nested in it, into their immutable
counterparts.

The conversion map is in `getFreezeConversionMap()`.

You can register a new conversion using `register()` You can also 
pass a map of custom converters with `custom_converters` and a map 
of custom inverse converters with `custom_inverse_converters`, 
without using `register()`.

By default, if the type is not registered and has a `__dict__` 
attribute, it's converted to the `frozendict` of that `__dict__`.

This function assumes that hashable == immutable (that is not 
always true).

This function uses recursion, with all the limits of recursions in 
Python.

Where is a good old tail call when you need it?

### `frozendict.register(to_convert, converter, *, inverse = False)`

Adds a `converter` for a type `to_convert`. `converter`
must be callable. The new converter will be used by `deepfreeze()`
and has precedence over any previous converter. 

If `to_covert` has already a converter, a FreezeWarning is raised.

If `inverse` is True, the conversion is considered from an immutable 
type to a mutable one. This make it possible to convert mutable 
objects nested in the registered immutable one.

### `frozendict.unregister(type, inverse = False)`
Unregister a type from custom conversion. If `inverse` is `True`, 
the unregistered conversion is an inverse conversion 
(see `register()`).

# Examples

## frozendict examples
```python
from frozendict import frozendict

fd = frozendict(Guzzanti = "Corrado", Hicks = "Bill")

print(fd)
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})

frozendict({"Guzzanti": "Corrado", "Hicks": "Bill"})
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})

hash(fd)
# 5833699487320513741

fd_unhashable = frozendict({1: []})
hash(fd_unhashable)
# TypeError: Not all values are hashable.

frozendict({frozendict(nested = 4, key = 2): 42})
# frozendict({frozendict({'nested': 4, 'key': 2}): 42})

fd | {1: 2}
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})

fd.set(1, 2)
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})

fd.set("Guzzanti", "Sabina")
# frozendict.frozendict({'Guzzanti': 'Sabina', 'Hicks': 'Bill'})

fd.delete("Guzzanti")
# frozendict.frozendict({'Hicks': 'Bill'})

fd.setdefault("Guzzanti", "Sabina")
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})

fd.setdefault(1, 2)
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})

fd.key()
# 'Guzzanti'

fd.value(1)
# 'Bill'

fd.item(-1)
# (1, 2)

print(fd["Guzzanti"])
# Corrado

fd["Brignano"]
# KeyError: 'Brignano'

len(fd)
# 2

"Guzzanti" in fd
# True

"Guzzanti" not in fd
# False

"Brignano" in fd
# False

fd5 = frozendict(fd)
id_fd5 = id(fd5)
fd5 |= {1: 2}
fd5
# frozendict.frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill', 1: 2})
id(fd5) != id_fd5
# True

fd2 = fd.copy()
fd2 == fd
# True

fd3 = frozendict(fd)
fd3 == fd
# True

fd4 = frozendict({"Hicks": "Bill", "Guzzanti": "Corrado"})

print(fd4)
# frozendict({'Hicks': 'Bill', 'Guzzanti': 'Corrado'})

fd4 == fd
# True

import pickle
fd_unpickled = pickle.loads(pickle.dumps(fd))
print(fd_unpickled)
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'})
fd_unpickled == fd
# True

frozendict(Guzzanti="Corrado", Hicks="Bill")
# frozendict({'Guzzanti': 'Corrado', 'Hicks': 'Bill'}

fd.get("Guzzanti")
# 'Corrado'

print(fd.get("Brignano"))
# None

tuple(fd.keys())
# ('Guzzanti', 'Hicks')

tuple(fd.values())
# ('Corrado', 'Bill')

tuple(fd.items())
# (('Guzzanti', 'Corrado'), ('Hicks', 'Bill'))

frozendict.fromkeys(["Corrado", "Sabina"], "Guzzanti")
# frozendict({'Corrado': 'Guzzanti', 'Sabina': 'Guzzanti'})

iter(fd)
# <dict_keyiterator object at 0x7feb75c49188>

fd["Guzzanti"] = "Caterina"
# TypeError: 'frozendict' object doesn't support item assignment
```

## deepfreeze examples
```python
import frozendict as cool

from frozendict import frozendict
from array import array
from collections import OrderedDict
from types import MappingProxyType

class A:
    def __init__(self, x):
        self.x = x

a = A(3)
        
o = {"x": [
    5, 
    frozendict(y = {5, "b", memoryview(b"b")}), 
    array("B", (0, 1, 2)), 
    OrderedDict(a=bytearray(b"a")),
    MappingProxyType({2: []}),
    a
]}

cool.deepfreeze(o)
# frozendict(x = (
#     5, 
#     frozendict(y = frozenset({5, "b", memoryview(b"b")})), 
#     (0, 1, 2), 
#     frozendict(a = b'a'),
#     MappingProxyType({2: ()}),
#     frozendict(x = 3),
# ))

```

# Building
You can build `frozendict` directly from the code, using

```
python3 setup.py bdist_wheel
```

The C Extension is optional by default from version 2.3.5. You can make it mandatory by passing the environment variable `CIBUILDWHEEL` with value `1`

On the contrary, if you want the pure py implementation, you can pass the env var `FROZENDICT_PURE_PY` with value `1`

# Benchmarks

Some benchmarks between `dict` and `frozendict`[1]:

```
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`;         Size:    5; Keys: str; Type:       dict; Time: 8.02e-08; Sigma: 4e-09
Name: `constructor(d)`;         Size:    5; Keys: str; Type: frozendict; Time: 8.81e-08; Sigma: 3e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`;         Size:    5; Keys: int; Type:       dict; Time: 7.96e-08; Sigma: 5e-09
Name: `constructor(d)`;         Size:    5; Keys: int; Type: frozendict; Time: 8.97e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`;         Size: 1000; Keys: str; Type:       dict; Time: 6.38e-06; Sigma: 9e-08
Name: `constructor(d)`;         Size: 1000; Keys: str; Type: frozendict; Time: 6.21e-06; Sigma: 2e-07
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(d)`;         Size: 1000; Keys: int; Type:       dict; Time: 3.49e-06; Sigma: 3e-07
Name: `constructor(d)`;         Size: 1000; Keys: int; Type: frozendict; Time: 3.48e-06; Sigma: 2e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(kwargs)`;    Size:    5; Keys: str; Type:       dict; Time: 2.40e-07; Sigma: 1e-09
Name: `constructor(kwargs)`;    Size:    5; Keys: str; Type: frozendict; Time: 2.48e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(kwargs)`;    Size: 1000; Keys: str; Type:       dict; Time: 4.80e-05; Sigma: 1e-06
Name: `constructor(kwargs)`;    Size: 1000; Keys: str; Type: frozendict; Time: 2.90e-05; Sigma: 7e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`;      Size:    5; Keys: str; Type:       dict; Time: 2.01e-07; Sigma: 9e-10
Name: `constructor(seq2)`;      Size:    5; Keys: str; Type: frozendict; Time: 2.50e-07; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`;      Size:    5; Keys: int; Type:       dict; Time: 2.18e-07; Sigma: 2e-09
Name: `constructor(seq2)`;      Size:    5; Keys: int; Type: frozendict; Time: 2.73e-07; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`;      Size: 1000; Keys: str; Type:       dict; Time: 4.29e-05; Sigma: 6e-07
Name: `constructor(seq2)`;      Size: 1000; Keys: str; Type: frozendict; Time: 4.33e-05; Sigma: 6e-07
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(seq2)`;      Size: 1000; Keys: int; Type:       dict; Time: 3.04e-05; Sigma: 4e-07
Name: `constructor(seq2)`;      Size: 1000; Keys: int; Type: frozendict; Time: 3.45e-05; Sigma: 4e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`;         Size:    5; Keys: str; Type:       dict; Time: 7.93e-08; Sigma: 3e-09
Name: `constructor(o)`;         Size:    5; Keys: str; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`;         Size:    5; Keys: int; Type:       dict; Time: 7.94e-08; Sigma: 5e-09
Name: `constructor(o)`;         Size:    5; Keys: int; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`;         Size: 1000; Keys: str; Type:       dict; Time: 6.18e-06; Sigma: 3e-07
Name: `constructor(o)`;         Size: 1000; Keys: str; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
////////////////////////////////////////////////////////////////////////////////
Name: `constructor(o)`;         Size: 1000; Keys: int; Type:       dict; Time: 3.47e-06; Sigma: 2e-07
Name: `constructor(o)`;         Size: 1000; Keys: int; Type: frozendict; Time: 2.41e-08; Sigma: 6e-10
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`;               Size:    5; Keys: str; Type:       dict; Time: 7.28e-08; Sigma: 2e-09
Name: `o.copy()`;               Size:    5; Keys: str; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`;               Size:    5; Keys: int; Type:       dict; Time: 7.21e-08; Sigma: 4e-09
Name: `o.copy()`;               Size:    5; Keys: int; Type: frozendict; Time: 3.32e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`;               Size: 1000; Keys: str; Type:       dict; Time: 6.16e-06; Sigma: 3e-07
Name: `o.copy()`;               Size: 1000; Keys: str; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o.copy()`;               Size: 1000; Keys: int; Type:       dict; Time: 3.46e-06; Sigma: 1e-07
Name: `o.copy()`;               Size: 1000; Keys: int; Type: frozendict; Time: 3.18e-08; Sigma: 2e-09
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`;                 Size:    5; Keys: str; Type:       dict; Time: 7.23e-08; Sigma: 8e-10
Name: `o == o`;                 Size:    5; Keys: str; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`;                 Size:    5; Keys: int; Type:       dict; Time: 7.30e-08; Sigma: 1e-09
Name: `o == o`;                 Size:    5; Keys: int; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`;                 Size: 1000; Keys: str; Type:       dict; Time: 1.38e-05; Sigma: 1e-07
Name: `o == o`;                 Size: 1000; Keys: str; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `o == o`;                 Size: 1000; Keys: int; Type:       dict; Time: 1.05e-05; Sigma: 7e-08
Name: `o == o`;                 Size: 1000; Keys: int; Type: frozendict; Time: 2.44e-08; Sigma: 2e-09
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`;             Size:    5; Keys: str; Type:       dict; Time: 7.33e-08; Sigma: 2e-09
Name: `for x in o`;             Size:    5; Keys: str; Type: frozendict; Time: 6.70e-08; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`;             Size:    5; Keys: int; Type:       dict; Time: 7.33e-08; Sigma: 2e-09
Name: `for x in o`;             Size:    5; Keys: int; Type: frozendict; Time: 6.70e-08; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`;             Size: 1000; Keys: str; Type:       dict; Time: 8.84e-06; Sigma: 5e-08
Name: `for x in o`;             Size: 1000; Keys: str; Type: frozendict; Time: 7.06e-06; Sigma: 6e-08
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o`;             Size: 1000; Keys: int; Type:       dict; Time: 8.67e-06; Sigma: 7e-08
Name: `for x in o`;             Size: 1000; Keys: int; Type: frozendict; Time: 6.94e-06; Sigma: 3e-08
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`;    Size:    5; Keys: str; Type:       dict; Time: 7.28e-08; Sigma: 9e-10
Name: `for x in o.values()`;    Size:    5; Keys: str; Type: frozendict; Time: 6.48e-08; Sigma: 8e-10
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`;    Size:    5; Keys: int; Type:       dict; Time: 7.25e-08; Sigma: 1e-09
Name: `for x in o.values()`;    Size:    5; Keys: int; Type: frozendict; Time: 6.45e-08; Sigma: 1e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`;    Size: 1000; Keys: str; Type:       dict; Time: 9.06e-06; Sigma: 5e-07
Name: `for x in o.values()`;    Size: 1000; Keys: str; Type: frozendict; Time: 7.04e-06; Sigma: 4e-08
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.values()`;    Size: 1000; Keys: int; Type:       dict; Time: 9.53e-06; Sigma: 3e-08
Name: `for x in o.values()`;    Size: 1000; Keys: int; Type: frozendict; Time: 6.97e-06; Sigma: 3e-08
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`;     Size:    5; Keys: str; Type:       dict; Time: 1.13e-07; Sigma: 3e-09
Name: `for x in o.items()`;     Size:    5; Keys: str; Type: frozendict; Time: 1.16e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`;     Size:    5; Keys: int; Type:       dict; Time: 1.14e-07; Sigma: 3e-09
Name: `for x in o.items()`;     Size:    5; Keys: int; Type: frozendict; Time: 1.17e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`;     Size: 1000; Keys: str; Type:       dict; Time: 1.53e-05; Sigma: 3e-07
Name: `for x in o.items()`;     Size: 1000; Keys: str; Type: frozendict; Time: 1.53e-05; Sigma: 4e-07
////////////////////////////////////////////////////////////////////////////////
Name: `for x in o.items()`;     Size: 1000; Keys: int; Type:       dict; Time: 1.53e-05; Sigma: 3e-07
Name: `for x in o.items()`;     Size: 1000; Keys: int; Type: frozendict; Time: 1.55e-05; Sigma: 4e-07
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`;        Size:    5; Keys: str; Type:       dict; Time: 6.82e-07; Sigma: 2e-08
Name: `pickle.dumps(o)`;        Size:    5; Keys: str; Type: frozendict; Time: 2.86e-06; Sigma: 1e-07
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`;        Size:    5; Keys: int; Type:       dict; Time: 4.77e-07; Sigma: 2e-08
Name: `pickle.dumps(o)`;        Size:    5; Keys: int; Type: frozendict; Time: 2.72e-06; Sigma: 8e-08
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`;        Size: 1000; Keys: str; Type:       dict; Time: 1.24e-04; Sigma: 4e-06
Name: `pickle.dumps(o)`;        Size: 1000; Keys: str; Type: frozendict; Time: 1.92e-04; Sigma: 5e-06
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.dumps(o)`;        Size: 1000; Keys: int; Type:       dict; Time: 2.81e-05; Sigma: 6e-07
Name: `pickle.dumps(o)`;        Size: 1000; Keys: int; Type: frozendict; Time: 7.37e-05; Sigma: 1e-06
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`;     Size:    5; Keys: str; Type:       dict; Time: 9.08e-07; Sigma: 6e-09
Name: `pickle.loads(dump)`;     Size:    5; Keys: str; Type: frozendict; Time: 1.79e-06; Sigma: 9e-08
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`;     Size:    5; Keys: int; Type:       dict; Time: 4.46e-07; Sigma: 6e-09
Name: `pickle.loads(dump)`;     Size:    5; Keys: int; Type: frozendict; Time: 1.32e-06; Sigma: 7e-08
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`;     Size: 1000; Keys: str; Type:       dict; Time: 1.57e-04; Sigma: 8e-06
Name: `pickle.loads(dump)`;     Size: 1000; Keys: str; Type: frozendict; Time: 1.69e-04; Sigma: 7e-06
////////////////////////////////////////////////////////////////////////////////
Name: `pickle.loads(dump)`;     Size: 1000; Keys: int; Type:       dict; Time: 5.97e-05; Sigma: 5e-06
Name: `pickle.loads(dump)`;     Size: 1000; Keys: int; Type: frozendict; Time: 6.68e-05; Sigma: 2e-06
################################################################################
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`;       Size:    5; Keys: str; Type:       dict; Time: 1.88e-07; Sigma: 1e-09
Name: `class.fromkeys()`;       Size:    5; Keys: str; Type: frozendict; Time: 2.22e-07; Sigma: 7e-09
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`;       Size:    5; Keys: int; Type:       dict; Time: 2.08e-07; Sigma: 6e-09
Name: `class.fromkeys()`;       Size:    5; Keys: int; Type: frozendict; Time: 2.44e-07; Sigma: 2e-09
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`;       Size: 1000; Keys: str; Type:       dict; Time: 4.05e-05; Sigma: 4e-06
Name: `class.fromkeys()`;       Size: 1000; Keys: str; Type: frozendict; Time: 3.84e-05; Sigma: 5e-07
////////////////////////////////////////////////////////////////////////////////
Name: `class.fromkeys()`;       Size: 1000; Keys: int; Type:       dict; Time: 2.93e-05; Sigma: 7e-07
Name: `class.fromkeys()`;       Size: 1000; Keys: int; Type: frozendict; Time: 3.08e-05; Sigma: 2e-06
################################################################################
```

[1] Benchmarks done under Linux 64 bit, Python 3.10.2, using the C Extension.

            

Raw data

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