# Copyright 2009-2024 Joshua Bronson. All rights reserved. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # * Code review nav * # (see comments in __init__.py) # ============================================================================ # ← Prev: __init__.py Current: _abc.py Next: _base.py → # ============================================================================ """Provide the :class:`BidirectionalMapping` abstract base class.""" from __future__ import annotations import typing as t from abc import abstractmethod from ._typing import KT from ._typing import VT class BidirectionalMapping(t.Mapping[KT, VT]): """Abstract base class for bidirectional mapping types. Extends :class:`collections.abc.Mapping` primarily by adding the (abstract) :attr:`inverse` property, which implementers of :class:`BidirectionalMapping` should override to return a reference to the inverse :class:`BidirectionalMapping` instance. """ __slots__ = () @property @abstractmethod def inverse(self) -> BidirectionalMapping[VT, KT]: """The inverse of this bidirectional mapping instance. *See also* :attr:`bidict.BidictBase.inverse`, :attr:`bidict.BidictBase.inv` :raises NotImplementedError: Meant to be overridden in subclasses. """ # The @abstractmethod decorator prevents subclasses from being instantiated unless they # override this method. But an overriding implementation may merely return super().inverse, # in which case this implementation is used. Raise NotImplementedError to indicate that # subclasses must actually provide their own implementation. raise NotImplementedError def __inverted__(self) -> t.Iterator[tuple[VT, KT]]: """Get an iterator over the items in :attr:`inverse`. This is functionally equivalent to iterating over the items in the forward mapping and inverting each one on the fly, but this provides a more efficient implementation: Assuming the already-inverted items are stored in :attr:`inverse`, just return an iterator over them directly. Providing this default implementation enables external functions, particularly :func:`~bidict.inverted`, to use this optimized implementation when available, instead of having to invert on the fly. *See also* :func:`bidict.inverted` """ return iter(self.inverse.items()) class MutableBidirectionalMapping(BidirectionalMapping[KT, VT], t.MutableMapping[KT, VT]): """Abstract base class for mutable bidirectional mapping types.""" __slots__ = () # * Code review nav * # ============================================================================ # ← Prev: __init__.py Current: _abc.py Next: _base.py → # ============================================================================