PHP 8.2.30
Preview: _immutable_ctx.py Size: 2.40 KB
//opt/hc_python/lib64/python3.12/site-packages/dns/_immutable_ctx.py

# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license

# This implementation of the immutable decorator requires python >=
# 3.7, and is significantly more storage efficient when making classes
# with slots immutable.  It's also faster.

import contextvars
import inspect

_in__init__ = contextvars.ContextVar("_immutable_in__init__", default=False)


class _Immutable:
    """Immutable mixin class"""

    # We set slots to the empty list to say "we don't have any attributes".
    # We do this so that if we're mixed in with a class with __slots__, we
    # don't cause a __dict__ to be added which would waste space.

    __slots__ = ()

    def __setattr__(self, name, value):
        if _in__init__.get() is not self:
            raise TypeError("object doesn't support attribute assignment")
        else:
            super().__setattr__(name, value)

    def __delattr__(self, name):
        if _in__init__.get() is not self:
            raise TypeError("object doesn't support attribute assignment")
        else:
            super().__delattr__(name)


def _immutable_init(f):
    def nf(*args, **kwargs):
        previous = _in__init__.set(args[0])
        try:
            # call the actual __init__
            f(*args, **kwargs)
        finally:
            _in__init__.reset(previous)

    nf.__signature__ = inspect.signature(f)
    return nf


def immutable(cls):
    if _Immutable in cls.__mro__:
        # Some ancestor already has the mixin, so just make sure we keep
        # following the __init__ protocol.
        cls.__init__ = _immutable_init(cls.__init__)
        if hasattr(cls, "__setstate__"):
            cls.__setstate__ = _immutable_init(cls.__setstate__)
        ncls = cls
    else:
        # Mixin the Immutable class and follow the __init__ protocol.
        class ncls(_Immutable, cls):
            # We have to do the __slots__ declaration here too!
            __slots__ = ()

            @_immutable_init
            def __init__(self, *args, **kwargs):
                super().__init__(*args, **kwargs)

            if hasattr(cls, "__setstate__"):

                @_immutable_init
                def __setstate__(self, *args, **kwargs):
                    super().__setstate__(*args, **kwargs)

        # make ncls have the same name and module as cls
        ncls.__name__ = cls.__name__
        ncls.__qualname__ = cls.__qualname__
        ncls.__module__ = cls.__module__
    return ncls

Directory Contents

Dirs: 4 × Files: 56

Name Size Perms Modified Actions
- drwxr-xr-x 2025-04-04 08:02:00
Edit Download
quic DIR
- drwxr-xr-x 2025-04-04 08:02:00
Edit Download
rdtypes DIR
- drwxr-xr-x 2025-04-04 08:02:00
Edit Download
- drwxr-xr-x 2025-04-04 08:02:00
Edit Download
2.73 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
30.10 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
17.43 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
40.74 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
1.76 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
3.88 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
16.69 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
4.14 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
3.60 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
5.81 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.69 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.09 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
1.97 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
5.64 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.49 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
6.40 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
66.59 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
41.78 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
3.91 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
9.88 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
12.37 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.67 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
0 B lrw-r--r-- 2025-04-04 08:02:00
Edit Download
54.98 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
4.06 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
30.29 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.91 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
16.27 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
7.27 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
10.99 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
72.00 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
3.74 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
8.96 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
3.52 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
9.00 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
23.03 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
22.06 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
11.15 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.57 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.91 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
11.96 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
1.88 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
11.49 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
8.67 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.76 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
12.96 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
50.87 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
27.27 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
690 B lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.34 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
8.84 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
5.12 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.43 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
2.40 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
8.27 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download
1.62 KB lrw-r--r-- 2025-04-04 08:02:00
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).