# 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__importannotationsimporttypingastfromabcimportabstractmethodfrom._typingimportKTfrom._typingimportVTclassBidirectionalMapping(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@abstractmethoddefinverse(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.raiseNotImplementedError
[docs]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` """returniter(self.inverse.items())
classMutableBidirectionalMapping(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 →# ============================================================================