Skip to main content

A simple immutable dictionary

Project description

frozendict

Table of Contents

Introduction

Welcome, fellow programmer, to the house of frozendict and deepfreeze!

frozendict is a simple immutable dictionary. It's fast as dict, and sometimes faster!

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 pickled, unpickled 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:

pip install frozendict

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

CIBUILDWHEEL=1 pip install frozendict

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

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

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

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

frozendict-2.4.3.tar.gz (316.0 kB view details)

Uploaded Source

Built Distributions

frozendict-2.4.3-cp310-cp310-win_arm64.whl (33.9 kB view details)

Uploaded CPython 3.10Windows ARM64

frozendict-2.4.3-cp310-cp310-win_amd64.whl (37.3 kB view details)

Uploaded CPython 3.10Windows x86-64

frozendict-2.4.3-cp310-cp310-musllinux_1_1_x86_64.whl (118.5 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

frozendict-2.4.3-cp310-cp310-musllinux_1_1_aarch64.whl (119.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

frozendict-2.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (117.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

frozendict-2.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (117.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

frozendict-2.4.3-cp310-cp310-macosx_11_0_arm64.whl (37.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

frozendict-2.4.3-cp39-cp39-win_arm64.whl (34.2 kB view details)

Uploaded CPython 3.9Windows ARM64

frozendict-2.4.3-cp39-cp39-win_amd64.whl (37.5 kB view details)

Uploaded CPython 3.9Windows x86-64

frozendict-2.4.3-cp39-cp39-musllinux_1_1_x86_64.whl (117.8 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

frozendict-2.4.3-cp39-cp39-musllinux_1_1_aarch64.whl (118.6 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

frozendict-2.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (116.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

frozendict-2.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (117.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

frozendict-2.4.3-cp39-cp39-macosx_11_0_arm64.whl (37.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

frozendict-2.4.3-cp38-cp38-win_amd64.whl (37.2 kB view details)

Uploaded CPython 3.8Windows x86-64

frozendict-2.4.3-cp38-cp38-musllinux_1_1_x86_64.whl (118.6 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

frozendict-2.4.3-cp38-cp38-musllinux_1_1_aarch64.whl (119.8 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

frozendict-2.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (115.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

frozendict-2.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (115.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

frozendict-2.4.3-cp38-cp38-macosx_11_0_arm64.whl (37.5 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

frozendict-2.4.3-cp37-cp37m-win_amd64.whl (37.1 kB view details)

Uploaded CPython 3.7mWindows x86-64

frozendict-2.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl (106.0 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

frozendict-2.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl (106.5 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

frozendict-2.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (103.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

frozendict-2.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (103.8 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

frozendict-2.4.3-cp36-cp36m-win_amd64.whl (38.8 kB view details)

Uploaded CPython 3.6mWindows x86-64

frozendict-2.4.3-cp36-cp36m-musllinux_1_1_x86_64.whl (104.3 kB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ x86-64

frozendict-2.4.3-cp36-cp36m-musllinux_1_1_aarch64.whl (104.9 kB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ ARM64

frozendict-2.4.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (101.8 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

frozendict-2.4.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (102.0 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ ARM64

File details

Details for the file frozendict-2.4.3.tar.gz.

File metadata

  • Download URL: frozendict-2.4.3.tar.gz
  • Upload date:
  • Size: 316.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3.tar.gz
Algorithm Hash digest
SHA256 3bb6831c099028b49551fc9852f6ed43a0b901cecb65f6d293141a139dfa971f
MD5 25d3b48464d6df0496fa7ef4feee58ca
BLAKE2b-256 8ad53b155f70b795802802447070c5db7c86ad0a14ff2c20447ebedc97490b75

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-win_arm64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp310-cp310-win_arm64.whl
  • Upload date:
  • Size: 33.9 kB
  • Tags: CPython 3.10, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 abb89da4044e0e01d33da3de41392b51af6c6bb43e03aff6515d7d6aa38d5515
MD5 a82c077dc5ccb72349c3a3bbfdaf2491
BLAKE2b-256 5005c08ede0e4ceab8ad0ce7020e87bcf0f6d4c2ed64c35e4d6268fc0d99d8ba

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 37.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e7c2ebdca880dcc6161619428379ac21577735d594e319b0ea5cae3ae7e8e5ba
MD5 4a0bdfff16c255c1be7d2a8ede034b35
BLAKE2b-256 5d1fa3332d4d89f756d312303a0a973615703c5a6d2ca1637fb9b275f018694e

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3f930d5af0121be08235c6409f31c0a6e8e049af3b5ed9eb43cd7e688a362bae
MD5 1461e293699e80681c7928637e6261c8
BLAKE2b-256 848346646ee4309ffd8881ff85cd2491b62aa359b2cb2216375710e5168dff2a

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 f3afd54f0aad08cc3baaec9ecff57995008953e6a34cf78dc24ae0217d5bcd4c
MD5 4305af260834010e2e1e3f0a9fd13294
BLAKE2b-256 4c3102fd5de708e1669422c327f26322529f346a66ceac1b4ccc59545ebb738c

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3d30ca189dedd21ae16b4f596653b011e12fc459f31a5a2b3f2021d684cdd3bc
MD5 7766fbf6f56302f494ddda646bd8f352
BLAKE2b-256 9baa6ffc3f287669f54c6e02d4deeab6989dab9134d610372ad14bd12ec8fc74

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e6fb13829ebcdbfdcf09ab464717e74d94fd66ade23e423ccf3b92922b5645b0
MD5 3823b2bbde413ec7448062d7032c8a4c
BLAKE2b-256 27b6593794317a104ce235ab3db7c987fc3d7eccdb0dcd1f1dc3195cfcd8dac9

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8295584b3e6cdde2033405ab467c1fe28d68f50beb82b716e3b68fd0c4d1e6c5
MD5 6d32f76309e5957f26e751f1628f2876
BLAKE2b-256 2fec7e60107101cde8b2d2f9d56713b10b2803d90526481d7c473e55393c1a98

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-win_arm64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp39-cp39-win_arm64.whl
  • Upload date:
  • Size: 34.2 kB
  • Tags: CPython 3.9, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-win_arm64.whl
Algorithm Hash digest
SHA256 27a8af898f82255fb65722791002796b9694a4c5480e6d12d6e7221530d8294a
MD5 44ba639b6f41966d29f426e32b407f03
BLAKE2b-256 2b00798eb717eea45fe957eb0326ee2b162c39c9c4450d28ba09cb6fd176f412

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 37.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 664c185cac890016cc629f556b8fa4aa1d1ff56f8b96e30cde25e5294d0713b5
MD5 89eb81b72e332ca244411e8dd82520e3
BLAKE2b-256 d573d6728570540ba24aacda89ffd3503a64f4d2a74e300357f4c5cc8f9b9431

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 30c9eb3a599ed7624f03a3d9777503852c9d52a8b190c43225c5b6353bfca204
MD5 4b2dc087029bc86d69028df48769549b
BLAKE2b-256 51543dadac7eb60e2268ef5e9c9381bd0d8ab442ae6fa6f2bbeb5890b595699a

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 55fd13532c5bcab80ab9543f2344f67c4d6a38a04c7b5bc5317a7d3b7e00c0d3
MD5 8860cdcb26afa9bbc4987265d3ddde9c
BLAKE2b-256 426522f1bf216f4a2afa89b28dbffad3369c6018963be1cef1f90eeba3366a2c

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 12a4af1c819c8bae63f72a56af1410e158ac674d492d8dcffd6001bdd022a6c3
MD5 a1c81e283926a187fa6142912e900dc2
BLAKE2b-256 6e965116c1960562821a467c789c8458e8941878c861ebd5484299fce2dc56df

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4d2b1588b9913e8e281781ab78627961f566657e94eb23e95b0b6d47c531553a
MD5 9abab8641a409d037d59f45c63db0c7d
BLAKE2b-256 ea3e4c021178917c541f4e54df84da7e29a0905b2d41b1df02a8033f321866f3

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98cb02ea3d0c1110f79ecedfce79903f0c915a9466180e09a847ed813be5e521
MD5 3eddc6c9341a58bfdc03b25afc8ed572
BLAKE2b-256 49095e196749bd4b70f430e40199635b1c5a2b116d21ae2e71bfffc0b1ab8f86

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 37.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 dd4e6c888884c662f0074ac35b3e10a6ee3cccd2f550c489a4c03cbf70ece03e
MD5 36169408c73821c0825c0eccf1a2b836
BLAKE2b-256 bc659aa285c15878835d3482cb0bdc6d5d54ef04069b5730fada7cd1c8986e25

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d49c10ed8cdb678cd6d46367391bc3cde9e6b705ceba83c4bd58854557a9304a
MD5 d450f4ffaae693ffcc1303ec52b2edec
BLAKE2b-256 3870bc98ebf93ed1096a485e9f58445bbb5a215b0e70e5f03efcfc8b75ab9613

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp38-cp38-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2f150aabd05655075e7bb47c0bb7d91765649e4729e91d1ac4b1512c1f785256
MD5 a348c0cbd6543262f47adce1278a3d90
BLAKE2b-256 5746838fe5b4264003f2edac59b2601e9ba7102b34c6fa6ba6be76b0f94eb33b

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a94e88e3f457fb9f4039890a756e157a0b5e5a005bcfe6367295f511193a319
MD5 e3f7439ca32db0099eaf27005a43ca22
BLAKE2b-256 1c4f3f276d947de22208a956ddbe48a6fdc1d346e0abf582d3eb51fe042193cc

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3196a0c856bd4eb8e192d26a959ec10441c4116b6f9da336030b6975257c9daa
MD5 a448a700c7f03387b30ff60e2acb3fe5
BLAKE2b-256 98d5675bc941c965cafb18ea3a7e32ec02b47d806dfc5bef0ef9ff4775b26156

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 24d520a2264b9eba37ea19ca6a5523bf0d8a0330d0902bf50f2d1817e6e8139c
MD5 1291b34c101b89226990d1525900b454
BLAKE2b-256 530d29304f25675d0a5b4b012a22a3bfb69ace885788236a50c9f759e5f066d5

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 37.1 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 8153f09bd71800eb866626124b3fb54dae2fb6dbb342cb1d38485d8fe95bf61e
MD5 8878049439741b057faf400a34fcf887
BLAKE2b-256 0aafcd371e211fd9a27534caeda5c4751044fb7dbb7b18e748869cf334b8c955

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a64f6c6ccf201182edf003e27b25c790dc7d9ba1b94ae84f3060d969bc985810
MD5 e8219dd78feac3ac4b9f88f8628111dc
BLAKE2b-256 2707532a31d99e29751680fc4c1589d0ecc310092213427d9edfdfb725f02f29

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 ddcfc657058e71bf3641d749f2b22d2dd92cc25d58b232e8e2c2bc0fcf0b6fb4
MD5 9a574d1cf7ec9a3a953ac5435f006836
BLAKE2b-256 833b6d8e96c9c764f58721894c2c95ccee2a8de32769bb9de2c813ef70115b4e

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4cb1eb811b43c3183482b09f9a5b9ed8662b213e57ca090692433bc234001ae5
MD5 5e135182f188bd84dfc2a84c545a9c9b
BLAKE2b-256 cff13536ec60c8112615767b7e2742d2862dd3c0a37a271a71936f8cec88fdea

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 904165b873897e2a0e3faf742570fcdaa57c403f86a2553f432c2498cd315f9f
MD5 6efcc6ad05ed973b890ff75d39d7b661
BLAKE2b-256 09d27fff07c9940947c60cf3e2df31d4c18784e7f5904aad9fc6495e8afd2ead

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: frozendict-2.4.3-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 38.8 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for frozendict-2.4.3-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 d4527d411d7d228c2907aeeb0e6bad87401571982a05a27d0f8334c64353c22c
MD5 c6fb0eace808b18c6c4e3d9d8cac44c4
BLAKE2b-256 1bffe8c07d3e73796c7b2008b4308171cee55726303053484350f17553e554ce

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp36-cp36m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f5c0f53db39d2ccf4b126983a0657ec67e41134e7fa43b424408291aa2804746
MD5 7ad83f8791dbb83f7babad33aad62336
BLAKE2b-256 dbbcc8743d84d4bc4069daca3795ce6a09b0f08a7df1f4b45d615bebe803e7a9

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp36-cp36m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp36-cp36m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d7684df22e7ca8d2a27cc4806fb66da6ef63ffc7b825d0f20fceab91202fea64
MD5 ecc4b46b35f2210ddf6495874adb8f62
BLAKE2b-256 dcc163fe80f6c978133c49bea562aff4a6d2f31ef749006a7a7899c6e37b0150

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a0f7d4b17485d1a13fe4efa6be4c9b9a9977208a68d4ef4b8b4be7578eaacabb
MD5 aac4d171dbcdad5ba735e0741e6c00e8
BLAKE2b-256 9cce8822d76be8f0d6ae1de8971914a14afc5f10c38699e4344163781109a2e5

See more details on using hashes here.

File details

Details for the file frozendict-2.4.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for frozendict-2.4.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 283dd1a5a815ae093aa265149c30ded5b3da9544a1894179ea21fdb35771fe48
MD5 b0077794bef65ca5b106da5f26dc47c3
BLAKE2b-256 209600055283fdfcfa56232ee4512da41903dc213f12774f5907945fbfc9b70d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page