# Copyright (c) 2008 - 2022, Ilan Schnell; All Rights Reserved """ This package defines an object type which can efficiently represent a bitarray. Bitarrays are sequence types and behave very much like lists. Please find a description of this package at: https://github.com/ilanschnell/bitarray Author: Ilan Schnell """ from __future__ import absolute_import from bitarray._bitarray import (bitarray, decodetree, _sysinfo, get_default_endian, _set_default_endian, __version__) __all__ = ['bitarray', 'frozenbitarray', 'decodetree', 'bits2bytes'] class frozenbitarray(bitarray): """frozenbitarray(initializer=0, /, endian='big', buffer=None) -> \ frozenbitarray Return a frozenbitarray object, which is initialized the same way a bitarray object is initialized. A frozenbitarray is immutable and hashable. Its contents cannot be altered after it is created; however, it can be used as a dictionary key. """ def __init__(self, *args, **kwargs): self._freeze() def __repr__(self): return 'frozen' + bitarray.__repr__(self) def __hash__(self): "Return hash(self)." if getattr(self, '_hash', None) is None: # ensure hash is independent of endianness, also the copy will be # mutable such that .tobytes() can zero out the pad bits a = bitarray(self, 'big') self._hash = hash((len(a), a.tobytes())) return self._hash # Technically the code below is not necessary, as all these methods will # raise a TypeError on read-only memory. However, with a different error # message. def __delitem__(self, *args, **kwargs): "" # no docstring raise TypeError("frozenbitarray is immutable") append = bytereverse = clear = extend = encode = fill = __delitem__ frombytes = fromfile = insert = invert = pack = pop = __delitem__ remove = reverse = setall = sort = __setitem__ = __delitem__ __iadd__ = __iand__ = __imul__ = __ior__ = __ixor__ = __delitem__ __ilshift__ = __irshift__ = __delitem__ def bits2bytes(__n): """bits2bytes(n, /) -> int Return the number of bytes necessary to store n bits. """ import sys if not isinstance(__n, (int, long) if sys.version_info[0] == 2 else int): raise TypeError("integer expected") if __n < 0: raise ValueError("non-negative integer expected") return (__n + 7) // 8 def test(verbosity=1, repeat=1): """test(verbosity=1, repeat=1) -> TextTestResult Run self-test, and return unittest.runner.TextTestResult object. """ from bitarray import test_bitarray return test_bitarray.run(verbosity=verbosity, repeat=repeat)