Skip to main content

Accretive data structures.

Project description

Project Version PyPI - Status Tests Status Code Coverage Percentage Python Versions Project License

A Python library package which provides accretive data structures.

Accretive data structures can grow at any time but can never shrink. An accretive dictionary accepts new entries, but cannot have existing entries altered or removed. Similarly, an accretive namespace accepts new attributes, but cannot have existing attributes assigned to new values or deleted.

Accretive data structures are useful as registries, which may be incrementally initialized, but should have immutable state, once initialized. In general, they are a good compromise between the safety of immutability and the convenience of incremental initialization.

In addition to accretive dictionaries (including dictionaries with default entries) and namespaces, this package also provides accretive classes (including abstract base classes), modules, and objects. Subpackages provide variants of all of these with some additional behaviors or constraints. Modules of aliases are also provided to satisfy various import styles and nomenclatural conventions.

Examples

Accretive Namespace

An accretive namespace, similar to types.SimpleNamespace, is available. This namespace can be initialized from multiple iterables and from keyword arguments. (Keyword arguments shown below; see documentation for additional forms of initialization.)

>>> from accretive import Namespace
>>> ns = Namespace( apples = 12, bananas = 6, cherries = 42 )
>>> ns
accretive.namespaces.Namespace( apples = 12, bananas = 6, cherries = 42 )

Arbitrary attributes can be assigned, as is expected in Python.

>>> ns.blueberries = 96
>>> ns.strawberries = 24
>>> ns
accretive.namespaces.Namespace( apples = 12, bananas = 6, cherries = 42, blueberries = 96, strawberries = 24 )

Since the namespace is accretive, attributes cannot be deleted.

>>> del ns.apples
Traceback (most recent call last):
...
accretive.exceptions.IndelibleAttributeError: Cannot reassign or delete existing attribute 'apples'.

Or reassigned.

>>> ns.apples = 14
Traceback (most recent call last):
...
accretive.exceptions.IndelibleAttributeError: Cannot reassign or delete existing attribute 'apples'.

The attributes thus retain their original values.

>>> ns
accretive.namespaces.Namespace( apples = 12, bananas = 6, cherries = 42, blueberries = 96, strawberries = 24 )

Accretive Dictionary

An accretive dictionary, similar to dict, is available. This dictionary can be initialized from multiple iterables and from keyword arguments. (Keyword arguments shown below; see documentation for additional forms of initialization.)

>>> from accretive import Dictionary
>>> dct = Dictionary( apples = 12, bananas = 6, cherries = 42 )
>>> dct
accretive.dictionaries.Dictionary( {'apples': 12, 'bananas': 6, 'cherries': 42} )

Entries can be added to the dictionary after initialization. This includes via a batch operation, such as update, which can accept the same forms of arguments as dictionary initialization.

>>> dct.update( blueberries = 96, strawberries = 24 )
accretive.dictionaries.Dictionary( {'apples': 12, 'bananas': 6, 'cherries': 42, 'blueberries': 96, 'strawberries': 24} )

Since the dictionary is accretive, existing entries cannot be removed.

>>> del dct[ 'bananas' ]
Traceback (most recent call last):
...
accretive.exceptions.IndelibleEntryError: Cannot update or remove existing entry for 'bananas'.

Or altered.

>>> dct[ 'bananas' ] = 11
Traceback (most recent call last):
...
accretive.exceptions.IndelibleEntryError: Cannot update or remove existing entry for 'bananas'.

The entries thus remain unchanged.

>>> dct
accretive.dictionaries.Dictionary( {'apples': 12, 'bananas': 6, 'cherries': 42, 'blueberries': 96, 'strawberries': 24} )

Installation

pip install accretive

More Flair

…than the required minimum

GitHub last commit Hatch pre-commit Bandit Mypy Pylint Ruff PyPI - Implementation PyPI - Wheel

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

accretive-2.0a1.tar.gz (17.8 kB view details)

Uploaded Source

Built Distribution

accretive-2.0a1-py3-none-any.whl (24.9 kB view details)

Uploaded Python 3

File details

Details for the file accretive-2.0a1.tar.gz.

File metadata

  • Download URL: accretive-2.0a1.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for accretive-2.0a1.tar.gz
Algorithm Hash digest
SHA256 d013f2bab018dedcb47ea2e56cca94d1dcd1382098c1b47ba890fc777bb4e480
MD5 aef050beada33ca74c9a09117393f874
BLAKE2b-256 c2dd3f91914d45d042fd8bd48a8106bcb06fb7f19d0f217637b1d4faf015554d

See more details on using hashes here.

Provenance

The following attestation bundles were made for accretive-2.0a1.tar.gz:

Publisher: releaser.yaml on emcd/python-accretive

Attestations:

File details

Details for the file accretive-2.0a1-py3-none-any.whl.

File metadata

  • Download URL: accretive-2.0a1-py3-none-any.whl
  • Upload date:
  • Size: 24.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for accretive-2.0a1-py3-none-any.whl
Algorithm Hash digest
SHA256 c7bea435e2d351bb0047031c81cd1f750db0389f6c68febbf48dcf0df2740c41
MD5 0fce5c0f0f4b2ffada2ee8532064ef44
BLAKE2b-256 5aaa6a317def64f90b30539bdaef2949ea977d6e78a57d09e0a7b924cd7ac508

See more details on using hashes here.

Provenance

The following attestation bundles were made for accretive-2.0a1-py3-none-any.whl:

Publisher: releaser.yaml on emcd/python-accretive

Attestations:

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