Skip to content
Back to top

# Source code for bidict._dup

    # 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/.

    """Provide :class:`OnDup` and related functionality."""

    from __future__ import annotations

    import typing as t
    from enum import Enum

    class OnDupAction(Enum):
        """An action to take to prevent duplication from occurring."""

        #: Raise a :class:`~bidict.DuplicationError`.
        RAISE = 'RAISE'
        #: Overwrite existing items with new items.
        DROP_OLD = 'DROP_OLD'
        #: Keep existing items and drop new items.
        DROP_NEW = 'DROP_NEW'

        def __repr__(self) -> str:
            return f'{self.__class__.__name__}.{self.name}'

    RAISE: t.Final[OnDupAction] = OnDupAction.RAISE
    DROP_OLD: t.Final[OnDupAction] = OnDupAction.DROP_OLD
    DROP_NEW: t.Final[OnDupAction] = OnDupAction.DROP_NEW

    class OnDup(t.NamedTuple):
        r"""A combination of :class:`~bidict.OnDupAction`\s specifying how to handle various types of duplication.

        The :attr:`~OnDup.key` field specifies what action to take when a duplicate key is encountered.

        The :attr:`~OnDup.val` field specifies what action to take when a duplicate value is encountered.

        In the case of both key and value duplication across two different items,
        only :attr:`~OnDup.val` is used.

        *See also* :ref:`basic-usage:Values Must Be Unique`
        (https://bidict.rtfd.io/basic-usage.html#values-must-be-unique)
        """

        key: OnDupAction = DROP_OLD
        val: OnDupAction = RAISE

    #: Default :class:`OnDup` used for the
    #: :meth:`~bidict.bidict.__init__`,
    #: :meth:`~bidict.bidict.__setitem__`, and
    #: :meth:`~bidict.bidict.update` methods.
    ON_DUP_DEFAULT: t.Final[OnDup] = OnDup(key=DROP_OLD, val=RAISE)
    #: An :class:`OnDup` whose members are all :obj:`RAISE`.
    ON_DUP_RAISE: t.Final[OnDup] = OnDup(key=RAISE, val=RAISE)
    #: An :class:`OnDup` whose members are all :obj:`DROP_OLD`.
    ON_DUP_DROP_OLD: t.Final[OnDup] = OnDup(key=DROP_OLD, val=DROP_OLD)