From 8749dc0434917102c52833a54c02dcae8d15eec7 Mon Sep 17 00:00:00 2001 From: Nathan Denny Date: Tue, 10 Jun 2025 03:38:46 -0400 Subject: [PATCH] Added "freeze" function to create immutable copies of mutable objects. --- lib/Bastion/Common.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/Bastion/Common.py b/lib/Bastion/Common.py index ffef0b0..b493ce9 100644 --- a/lib/Bastion/Common.py +++ b/lib/Bastion/Common.py @@ -12,6 +12,13 @@ import pathlib import logging import urllib +from functools import singledispatch +from types import MappingProxyType + +try: + from frozendict import frozendict +except ImportError: + frozendict = lambda d: MappingProxyType(d) from typing import Any, FrozenSet @@ -487,3 +494,26 @@ def asInteger(x): def asNumeric(x): return float(x) + +@singledispatch +def freeze(obj): + """ + An outer function that takes a generic object and attempts to build an immutable version of the given object. + """ + return obj # default: assume immutable + +@freeze.register +def _(obj: dict): + return frozendict({freeze(k): freeze(v) for k, v in obj.items()}) + +@freeze.register +def _(obj: list): + return tuple(freeze(i) for i in obj) + +@freeze.register +def _(obj: set): + return frozenset(freeze(i) for i in obj) + +@freeze.register +def _(obj: tuple): + return tuple(freeze(i) for i in obj)