Skip to main content

Immutable views on other collection objects

Project description

Version on Pypi Actions status Docs build status (master) Test coverage (master)

Overview

The immutable-views package provides collection classes that are immutable views on other (mutable) collection objects:

  • DictView - immutable view on another mapping (dictionary) object.

  • ListView - immutable view on another sequence (list) object.

  • SetView - immutable view on another set object.

An important behavior of views is that they are “live”: Since the view classes delegate to the underlying collection, any modification of the underlying collection object will be visible in the view object.

Creating an immutable view on a collection does not copy the collection and is therefore much faster than creating an immutable copy of the collection.

The memory overhead of using immutable views is very small: An object of any of the view classes in the immutable-views package occupies 40 Bytes (measured in CPython 3.9 on macOS), and because the view object only has a reference to its underlying collection object, that size is independent of the number of items in the collection.

The compute overhead is also very small, it is basically an additional function call to the corresponding function of the underlying collection.

Immutable views are useful if a method or function maintains data in form of a mutable collection and is intended to return that data but users should not be able to modify the data. The underlying collection can be updated by the method or function as needed, but the caller only gets an immutable view on it.

The view classes in the immutable-views package implement the complete behavior of the corresponding Python collection types except for any operations that would modify the underlying collection object.

The view classes delegate all operations to the underlying collection object they are a view of. Therefore, the underlying collection can be any kind of collection implementation (i.e. not just the standard Python collection classes).

Note that the immutability of the view objects only applies to the view object itself and to its underlying collection, but not to the items in the underlying collection. So if the underlying collection contains mutable objects, they will still be mutable when accessed through the view objects.

The standard Python class types.MappingProxyType serves the same purpose as the DictView class but it does not support pickling or hashing and was added only in Python 3.3. The dictproxy class from the dictproxyhack package on Pypi supports Python 2 and Python 3 and uses Python classes where available (e.g. MappingProxyType on Python 3.3 and later, and the internal mappingproxy class used for __dict__ on CPython) but also does not support pickling or hashing. The lack of support for standard dictionary behaviors prevents their use in cases where the view class is used as a read-only replacement for the standard dictionary.

Note that there are several packages on Pypi that provide immutable collections, but they all are collections on their own, and not views on other collections. Here is a notable subset of such packages:

Examples

Example with dictionaries:

$ python
>>> from immutable_views import DictView
>>> dict1 = {'a': 1, 'b': 2}
>>> dictview1 = DictView(dict1)

# Read-only access to the underlying collection through the view is supported:
>>> dictview1['a']
1

# Modifying the underlying collection through the view is rejected:
>>> dictview1['a'] = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'DictView' object does not support item assignment

# Modifications of the underlying collection are visible in the view:
>>> dict1['a'] = 2
>>> dictview1['a']
2

Example with lists:

$ python
>>> from immutable_views import ListView
>>> list1 = ['a', 'b']
>>> listview1 = ListView(list1)

# Read-only access to the underlying collection through the view is supported:
>>> listview1[0]
'a'

# Modifying the underlying collection through the view is rejected:
>>> listview1[0] = 'c'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'ListView' object does not support item assignment

# Modifications of the underlying collection are visible in the view:
>>> list1[0] = 'c'
>>> listview1[0]
'c'

Example with sets:

$ python
>>> from immutable_views import SetView
>>> set1 = {'a', 'b'}
>>> setview1 = SetView(set1)

# Read-only access to the underlying collection through the view is supported:
>>> 'a' in setview1
True

# Modifying the underlying collection through the view is rejected:
>>> setview1.add('c')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'SetView' object has no attribute 'add'

# Modifications of the underlying collection are visible in the view:
>>> set1.add('c')
>>> 'c' in setview1
True

Documentation and change log

License

The immutable-views project is provided under the Apache Software License 2.0.

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

immutable-views-0.6.1.tar.gz (45.6 kB view details)

Uploaded Source

Built Distribution

immutable_views-0.6.1-py2.py3-none-any.whl (20.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file immutable-views-0.6.1.tar.gz.

File metadata

  • Download URL: immutable-views-0.6.1.tar.gz
  • Upload date:
  • Size: 45.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.10.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.1

File hashes

Hashes for immutable-views-0.6.1.tar.gz
Algorithm Hash digest
SHA256 48e0543786e8a196667fb8412ce35c4f555ce08f39eab21dcf4b0a23d8d19295
MD5 ff0b14e1578ad644cc1b12b977d18921
BLAKE2b-256 ce056c84a56d52ad8e838389651a59e7e71d175ca26656605883b79fe3a734e2

See more details on using hashes here.

File details

Details for the file immutable_views-0.6.1-py2.py3-none-any.whl.

File metadata

  • Download URL: immutable_views-0.6.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 20.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.10.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.1

File hashes

Hashes for immutable_views-0.6.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 549dbe1106c53e26da28e1ab0f19f54ff20592cc6590f791ffd060de140c1aff
MD5 730a678de0f25b4cbc145d73d02cd29a
BLAKE2b-256 87cc003c1a4965e2499fdf9bde2543d3d55205fdd7c47b11d5b52be94ef4c535

See more details on using hashes here.

Supported by

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