Skip to main content

datahold

Project description

Overview

Wrap common mutable datastructures for inheritance with modification.

Content

HoldABC

class HoldABC(abc.ABC):
    @abc.abstractmethod
    def __init__(self, *args, **kwargs) -> None: ...

    @property
    @abc.abstractmethod
    def data(self): ...

HoldList

To understand the class HoldList here the beginning of its code:

class HoldList(HoldABC, collections.abc.MutableSequence):

    data: list

    @functools.wraps(list.__add__)
    def __add__(self, *args, **kwargs):
        data = self.data
        ans = data.__add__(*args, **kwargs)
        self.data = data
        return ans

The following methods are defined this way: __add__, __contains__, __delitem__, __eq__, __format__, __ge__, __getitem__, __gt__, __hash__, __iadd__, __imul__, __iter__, __le__, __len__, __lt__, __mul__, __repr__, __reversed__, __rmul__, __setitem__, __str__, append, clear, copy, count, extend, index, insert, pop, remove, reverse, sort.

The only function present in list and absent in HoldList is __class_getitem__

We can use HoldList as parent for a list-like class. It is necessary to implement in the subclass:

  • a property named data

  • the __init__ magic method

This allows the creatation of a list-like class with modified behaviour with only minimal effort. To enhance perpormance we can overwrite some of the methods.

HoldDict

Just like HoldList but for dict… It inherits from HoldABC and collections.abc.MutableMapping. The following methods are implemented: __contains__, __delitem__, __eq__, __format__, __ge__, __getitem__, __gt__, __hash__, __ior__, __iter__, __le__, __len__, __lt__, __or__, __repr__, __reversed__, __ror__, __setitem__, __str__, clear, copy, get, items, keys, pop, popitem, setdefault, update, values. The classmethods __class_getitem__ and fromkeys are not implemented.

HoldSet

Just like HoldSet but for set… It inherits from HoldABC and collections.abc.MutableSet. The following methods are implemented: __and__, __contains__, __eq__, __format__, __ge__, __gt__, __hash__, __iand__, __ior__, __isub__, __iter__, __ixor__, __le__, __len__, __lt__, __or__, __rand__, __repr__, __ror__, __rsub__, __rxor__, __str__, __sub__, __xor__, add, clear, copy, difference, difference_update, discard, intersection, intersection_update, isdisjoint, issubset, issuperset, pop, remove, symmetric_difference, symmetric_difference_update, union, update. The classmethod __class_getitem__ is not implemented.

OkayABC

A common abc for OkayList, OkayDict, and OkaySet. Child of Protected (see protectedclasses), Scaevola (see scaevola), and HoldABC. It implements common sense overwrites for some methods. For example:

  • all methods that cannot actually change the underlying object are now bound to _data instead of data

  • __bool__ is implemented as bool(self._data) because neither list, dict, nor set have a __bool__ method defined.

  • __hash__ raises now a more fitting exception

  • the comparison operations are overwritten:

    • __eq__ returns self._data == type(self._data)(other)

    • __ne__ negates __eq__

    • __ge__ returns type(self)(other) <= self (inherited from scaevola.Scaevola)

    • __gt__ returns not (self == other) and (self >= other)

    • __lt__ returns not (self == other) and (self <= other)

    • __le__ returns self._data <= type(self)(other)._data

    • modify __eq__ or __le__ as needed to change the behaviour of the other comparison methods

OkayList

This class inherits from HoldList and OkayABC. It implements a data property that binds a variable _data.

@property
def data(self, /):
    return list(self._data)

@data.setter
def data(self, values, /):
    self._data = list(values)

@data.deleter
def data(self, /):
    self._data = list()

Based on that it implements common sense methods. For example:

  • all methods that returned a list before now return OkayList (type adapts to further inheritance)

  • __init__ allows now to set data immediately

OkayDict

A subclass of HoldDict with common sense implementations for further inheritance just like OkayList for HoldList.

OkaySet

A subclass of HoldSet with common sense implementations for further inheritance just like OkayList for HoldList.

Installation

To install datahold, you can use pip. Open your terminal and run:

pip install datahold

License

This project is licensed under the MIT License.

Credits

Thank you for using datahold!

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

datahold-1.1.4.tar.gz (9.7 kB view details)

Uploaded Source

Built Distribution

datahold-1.1.4-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file datahold-1.1.4.tar.gz.

File metadata

  • Download URL: datahold-1.1.4.tar.gz
  • Upload date:
  • Size: 9.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for datahold-1.1.4.tar.gz
Algorithm Hash digest
SHA256 01e060d097aa61e8a93423e6add181f765baf74f52f434ce78bff69ade540865
MD5 8d47f51e538dc26d70ba50124d17b234
BLAKE2b-256 8c8db299e80ff1174c440c09f100b1f8783eb88efa8cb438231caa6e6278a686

See more details on using hashes here.

File details

Details for the file datahold-1.1.4-py3-none-any.whl.

File metadata

  • Download URL: datahold-1.1.4-py3-none-any.whl
  • Upload date:
  • Size: 8.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for datahold-1.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 2debe9272983f4d702290566054f76172da710ca0dc5c0d96915b3af9d6e3214
MD5 9384cc64c56bc36116727a6799cca8ab
BLAKE2b-256 cda1c61be2b9e827bc1d5dedaff83264f622b7850469a72a2408770f8020559d

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