immutables 0.21


pip install immutables

  Latest version

Released: Oct 10, 2024

Project Links

Meta
Author: MagicStack Inc
Requires Python: >=3.8.0

Classifiers

License
  • OSI Approved :: Apache Software License

Intended Audience
  • Developers

Programming Language
  • Python :: 3 :: Only
  • Python :: 3.8
  • Python :: 3.9
  • Python :: 3.10
  • Python :: 3.11
  • Python :: 3.12
  • Python :: Implementation :: CPython

Operating System
  • POSIX
  • MacOS :: MacOS X
  • Microsoft :: Windows

Topic
  • Software Development :: Libraries
https://github.com/MagicStack/immutables/workflows/Tests/badge.svg?branch=master https://img.shields.io/pypi/v/immutables.svg

An immutable mapping type for Python.

The underlying datastructure is a Hash Array Mapped Trie (HAMT) used in Clojure, Scala, Haskell, and other functional languages. This implementation is used in CPython 3.7 in the contextvars module (see PEP 550 and PEP 567 for more details).

Immutable mappings based on HAMT have O(log N) performance for both set() and get() operations, which is essentially O(1) for relatively small mappings.

Below is a visualization of a simple get/set benchmark comparing HAMT to an immutable mapping implemented with a Python dict copy-on-write approach (the benchmark code is available here):

bench.png

Installation

immutables requires Python 3.6+ and is available on PyPI:

$ pip install immutables

API

immutables.Map is an unordered immutable mapping. Map objects are hashable, comparable, and pickleable.

The Map object implements the collections.abc.Mapping ABC so working with it is very similar to working with Python dicts:

import immutables

map = immutables.Map(a=1, b=2)

print(map['a'])
# will print '1'

print(map.get('z', 100))
# will print '100'

print('z' in map)
# will print 'False'

Since Maps are immutable, there is a special API for mutations that allow apply changes to the Map object and create new (derived) Maps:

map2 = map.set('a', 10)
print(map, map2)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 10, 'b': 2})>

map3 = map2.delete('b')
print(map, map2, map3)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 10, 'b': 2})>
#   <immutables.Map({'a': 10})>

Maps also implement APIs for bulk updates: MapMutation objects:

map_mutation = map.mutate()
map_mutation['a'] = 100
del map_mutation['b']
map_mutation.set('y', 'y')

map2 = map_mutation.finish()

print(map, map2)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 100, 'y': 'y'})>

MapMutation objects are context managers. Here’s the above example rewritten in a more idiomatic way:

with map.mutate() as mm:
    mm['a'] = 100
    del mm['b']
    mm.set('y', 'y')
    map2 = mm.finish()

print(map, map2)
# will print:
#   <immutables.Map({'a': 1, 'b': 2})>
#   <immutables.Map({'a': 100, 'y': 'y'})>

Further development

  • An immutable version of Python set type with efficient add() and discard() operations.

License

Apache 2.0

Wheel compatibility matrix

Platform CPython 3.8 CPython 3.9 CPython 3.10 CPython 3.11 CPython 3.12 CPython 3.13
macosx_10_13_x86_64
macosx_10_9_x86_64
macosx_11_0_arm64
manylinux1_x86_64
manylinux2014_aarch64
manylinux2014_x86_64
manylinux_2_17_aarch64
manylinux_2_17_x86_64
manylinux_2_5_x86_64
musllinux_1_2_aarch64
musllinux_1_2_x86_64
win32
win_amd64

Files in release

immutables-0.21-cp310-cp310-macosx_10_9_x86_64.whl (30.5KiB)
immutables-0.21-cp310-cp310-macosx_11_0_arm64.whl (30.3KiB)
immutables-0.21-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (94.2KiB)
immutables-0.21-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (94.5KiB)
immutables-0.21-cp310-cp310-musllinux_1_2_aarch64.whl (93.0KiB)
immutables-0.21-cp310-cp310-musllinux_1_2_x86_64.whl (93.0KiB)
immutables-0.21-cp310-cp310-win32.whl (29.8KiB)
immutables-0.21-cp310-cp310-win_amd64.whl (33.1KiB)
immutables-0.21-cp311-cp311-macosx_10_9_x86_64.whl (30.5KiB)
immutables-0.21-cp311-cp311-macosx_11_0_arm64.whl (30.4KiB)
immutables-0.21-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (97.0KiB)
immutables-0.21-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (97.2KiB)
immutables-0.21-cp311-cp311-musllinux_1_2_aarch64.whl (95.2KiB)
immutables-0.21-cp311-cp311-musllinux_1_2_x86_64.whl (95.6KiB)
immutables-0.21-cp311-cp311-win32.whl (29.8KiB)
immutables-0.21-cp311-cp311-win_amd64.whl (33.6KiB)
immutables-0.21-cp312-cp312-macosx_10_13_x86_64.whl (31.1KiB)
immutables-0.21-cp312-cp312-macosx_11_0_arm64.whl (30.8KiB)
immutables-0.21-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (101.8KiB)
immutables-0.21-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (102.4KiB)
immutables-0.21-cp312-cp312-musllinux_1_2_aarch64.whl (97.4KiB)
immutables-0.21-cp312-cp312-musllinux_1_2_x86_64.whl (99.3KiB)
immutables-0.21-cp312-cp312-win32.whl (30.3KiB)
immutables-0.21-cp312-cp312-win_amd64.whl (34.3KiB)
immutables-0.21-cp313-cp313-macosx_10_13_x86_64.whl (31.2KiB)
immutables-0.21-cp313-cp313-macosx_11_0_arm64.whl (30.8KiB)
immutables-0.21-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (101.9KiB)
immutables-0.21-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (102.4KiB)
immutables-0.21-cp313-cp313-musllinux_1_2_aarch64.whl (97.6KiB)
immutables-0.21-cp313-cp313-musllinux_1_2_x86_64.whl (99.4KiB)
immutables-0.21-cp313-cp313-win32.whl (30.3KiB)
immutables-0.21-cp313-cp313-win_amd64.whl (34.3KiB)
immutables-0.21-cp38-cp38-macosx_10_9_x86_64.whl (30.5KiB)
immutables-0.21-cp38-cp38-macosx_11_0_arm64.whl (30.4KiB)
immutables-0.21-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (98.5KiB)
immutables-0.21-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (98.1KiB)
immutables-0.21-cp38-cp38-musllinux_1_2_aarch64.whl (96.1KiB)
immutables-0.21-cp38-cp38-musllinux_1_2_x86_64.whl (95.6KiB)
immutables-0.21-cp38-cp38-win32.whl (29.9KiB)
immutables-0.21-cp38-cp38-win_amd64.whl (33.1KiB)
immutables-0.21-cp39-cp39-macosx_10_9_x86_64.whl (30.4KiB)
immutables-0.21-cp39-cp39-macosx_11_0_arm64.whl (30.3KiB)
immutables-0.21-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (93.7KiB)
immutables-0.21-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (94.0KiB)
immutables-0.21-cp39-cp39-musllinux_1_2_aarch64.whl (92.6KiB)
immutables-0.21-cp39-cp39-musllinux_1_2_x86_64.whl (92.6KiB)
immutables-0.21-cp39-cp39-win32.whl (29.8KiB)
immutables-0.21-cp39-cp39-win_amd64.whl (33.1KiB)
immutables-0.21.tar.gz (86.9KiB)
Extras:
Dependencies: