cengal.data_manipulation.remote_objects.versions.v_0.remote_objects

   1#!/usr/bin/env python
   2# coding=utf-8
   3
   4# Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>
   5# 
   6# Licensed under the Apache License, Version 2.0 (the "License");
   7# you may not use this file except in compliance with the License.
   8# You may obtain a copy of the License at
   9# 
  10#     http://www.apache.org/licenses/LICENSE-2.0
  11# 
  12# Unless required by applicable law or agreed to in writing, software
  13# distributed under the License is distributed on an "AS IS" BASIS,
  14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15# See the License for the specific language governing permissions and
  16# limitations under the License.
  17
  18
  19__all__ = [
  20    'default_serializable_data_types',
  21    'known_types',
  22    'known_data_types',
  23    'known_container_types',
  24    'DataType',
  25    'data_type',
  26    'data_type_by_type',
  27    'ClassInfoFields',
  28    'ObjectInfoFields',
  29    'CanNotAdjustToSerializableError',
  30    'CanNotAdjustFromSerializableError',
  31    'RemoteObjectsManager',
  32]
  33
  34
  35from cengal.introspection.inspect import (
  36    entity_module_importable_str_and_owning_names_path,
  37    entity_by_name_module_importable_str_and_owning_names_path,
  38    filled_slot_names_with_values_gen,
  39    is_callable, is_async,
  40    is_setable_data_descriptor,
  41)
  42from cengal.code_flow_control.smart_values import ResultExistence
  43from cengal.code_flow_control.gc import DisableGC
  44from cengal.data_generation.id_generator import IDGenerator, GeneratorType
  45from enum import IntEnum
  46from collections.abc import MutableMapping, MutableSequence, MutableSet
  47from struct import pack, unpack
  48from inspect import getattr_static
  49from typing import Any, Dict, Optional, Callable, Set, Type, Tuple, List, FrozenSet
  50
  51
  52"""
  53Module Docstring
  54Docstrings: http://www.python.org/dev/peps/pep-0257/
  55"""
  56
  57__author__ = "ButenkoMS <gtalk@butenkoms.space>"
  58__copyright__ = "Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>"
  59__credits__ = ["ButenkoMS <gtalk@butenkoms.space>", ]
  60__license__ = "Apache License, Version 2.0"
  61__version__ = "4.4.1"
  62__maintainer__ = "ButenkoMS <gtalk@butenkoms.space>"
  63__email__ = "gtalk@butenkoms.space"
  64# __status__ = "Prototype"
  65__status__ = "Development"
  66# __status__ = "Production"
  67
  68
  69default_serializable_data_types: Set[Type] = {
  70    int, float, complex, str, bytes, bytearray, bool, type(None), list, tuple, set, frozenset, dict
  71}
  72
  73
  74known_types: Set[Type] = {
  75    int, float, complex, str, bytes, bytearray, bool, type(None), list, tuple, set, frozenset, dict,
  76    slice, 
  77}
  78
  79
  80known_data_types: Set[Type] = {
  81    int, float, str, bytes, bytearray, bool, type(None), slice,
  82}
  83
  84
  85known_container_types: Set[Type] = {
  86    complex, list, tuple, set, frozenset, dict,
  87}
  88
  89
  90class DataType(IntEnum):
  91    class_ = 0  # type is not in known_types and not in serializable_data_types
  92    int_ = 1
  93    float_ = 2
  94    complex_ = 3
  95    str_ = 4
  96    bytes_ = 5
  97    bytearray_ = 6
  98    bool_ = 7
  99    none_ = 8
 100    list_ = 9
 101    tuple_ = 10
 102    set_ = 11
 103    frozenset_ = 12
 104    dict_ = 13
 105    slice_ = 14
 106    unknown_serializable = 15  # type is in serializable_data_types but not in known_types
 107
 108
 109data_type: Dict[DataType, Type] = {
 110    DataType.class_: object,
 111    DataType.int_: int,
 112    DataType.float_: float,
 113    DataType.complex_: complex,
 114    DataType.str_: str,
 115    DataType.bytes_: bytes,
 116    DataType.bytearray_: bytearray,
 117    DataType.bool_: bool,
 118    DataType.none_: type(None),
 119    DataType.list_: list,
 120    DataType.tuple_: tuple,
 121    DataType.set_: set,
 122    DataType.frozenset_: frozenset,
 123    DataType.dict_: dict,
 124    DataType.slice_: slice,
 125    DataType.unknown_serializable: None,
 126}
 127
 128
 129data_type_by_type: Dict[Type, DataType] = {
 130    object: DataType.class_,
 131    int: DataType.int_,
 132    float: DataType.float_,
 133    complex: DataType.complex_,
 134    str: DataType.str_,
 135    bytes: DataType.bytes_,
 136    bytearray: DataType.bytearray_,
 137    bool: DataType.bool_,
 138    type(None): DataType.none_,
 139    list: DataType.list_,
 140    tuple: DataType.tuple_,
 141    set: DataType.set_,
 142    frozenset: DataType.frozenset_,
 143    dict: DataType.dict_,
 144    slice: DataType.slice_,
 145    None: DataType.unknown_serializable,
 146}
 147
 148
 149class ClassInfoFields(IntEnum):
 150    class_id = 0
 151    class_name = 1
 152    module_importable_str = 2
 153    owning_names_path = 3
 154
 155
 156class ObjectInfoFields(IntEnum):
 157    object_id = 0  # (type: int)
 158    type_id = 1  # (type: DataType)
 159    object_ = 2  # (Optional), (type: Any). Link to object itself if `(type(obj) in serializable_data_types)`. Not used otherwise.
 160    class_id = 3  # (Optional), (type: int). Used if `type_id == DataType.class_`
 161    clonable_slots = 4  # (Optional), (type: Tuple[Tuple[str, Any]]). Used if `type_id == DataType.class_`. Holds ID's (object_id) of slots objects.
 162    clonable_dict_items = 5  # (Optional), (type: Tuple[Tuple[str, Any]]). Used if `type_id == DataType.class_`. Holds ID's (object_id) of value objects.
 163    # contained_items = 6  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
 164    contained_mapping = 6  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
 165    contained_sequence = 7  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
 166    contained_set = 8  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
 167
 168
 169class CanNotAdjustToSerializableError(Exception):
 170    pass
 171
 172
 173class CanNotAdjustFromSerializableError(Exception):
 174    pass
 175
 176
 177class RemoteObjectsManager:
 178    def __init__(self, 
 179                 on_new_class_handler: Optional[Callable] = None,
 180                 on_new_obj_info_handler: Optional[Callable] = None,
 181                 # classess_db: Optional[Dict[int, Type]] = None, 
 182                 objects_db: Optional[Dict[int, Any]] = None, 
 183                 classes_id_gen: Optional[Callable] = None,
 184                 objects_id_gen: Optional[Callable] = None,
 185                 serializable_data_types: Optional[Set[Type]] = None,
 186                 ) -> None:
 187        # self.classess_db: Dict[int, Type] = dict() if classess_db is None else classess_db
 188        self.classes_id_gen: IDGenerator = IDGenerator() if classes_id_gen is None else classes_id_gen
 189        self.objects_db: Dict[int, Any] = dict() if objects_db is None else objects_db
 190        self.objects_id_gen: IDGenerator = IDGenerator() if objects_id_gen is None else objects_id_gen
 191        self.serializable_data_types: Set[Type] = default_serializable_data_types if serializable_data_types is None else serializable_data_types
 192        self.serializable_any: bool = not self.serializable_data_types
 193        self.serializable_int: bool = (int in self.serializable_data_types) or self.serializable_any
 194        self.serializable_float: bool = (float in self.serializable_data_types) or self.serializable_any
 195        self.serializable_complex: bool = (complex in self.serializable_data_types) or self.serializable_any
 196        self.serializable_str: bool = (str in self.serializable_data_types) or self.serializable_any
 197        self.serializable_bytes: bool = (bytes in self.serializable_data_types) or self.serializable_any
 198        self.serializable_bytearray: bool = (bytearray in self.serializable_data_types) or self.serializable_any
 199        self.serializable_bool: bool = (bool in self.serializable_data_types) or self.serializable_any
 200        self.serializable_none: bool = (type(None) in self.serializable_data_types) or self.serializable_any
 201        self.serializable_list: bool = (list in self.serializable_data_types) or self.serializable_any
 202        self.serializable_tuple: bool = (tuple in self.serializable_data_types) or self.serializable_any
 203        self.serializable_set: bool = (set in self.serializable_data_types) or self.serializable_any
 204        self.serializable_frozenset: bool = (frozenset in self.serializable_data_types) or self.serializable_any
 205        self.serializable_dict: bool = (dict in self.serializable_data_types) or self.serializable_any
 206        self.serializable_slice: bool = (slice in self.serializable_data_types) or self.serializable_any
 207        self.known_classes: Dict[Type, int] = dict()
 208        self.known_classes_by_id: Dict[int, Type] = dict()
 209        self.known_classes_info: Dict[Tuple, int] = dict()
 210        self.known_classes_info_by_id: Dict[int, Tuple] = dict()
 211        self.on_new_class_handler: Optional[Callable] = on_new_class_handler
 212        self.on_new_obj_info_handler: Optional[Callable] = on_new_obj_info_handler
 213        self.objects_ids: Dict[int, int] = dict()  # (Key: object_id, Value: id(obj))
 214        self.objects_ids_by_id: Dict[int, int] = dict()  # (Key: id(obj), Value: object_id)
 215
 216    def del_object_by_id(self, id_: int) -> None:
 217        if id_ in self.objects_ids_by_id:
 218            object_id = self.objects_ids_by_id[id_]
 219            self.objects_ids_by_id.pop(id_, None)
 220            self.objects_ids.pop(object_id, None)
 221            self.objects_db.pop(object_id, None)
 222    
 223    dobi = del_object_by_id
 224    
 225    def del_object_by_object_id(self, object_id: int) -> None:
 226        if object_id in self.objects_ids:
 227            id_ = self.objects_ids[object_id]
 228            self.objects_ids_by_id.pop(id_, None)
 229            self.objects_ids.pop(object_id, None)
 230            self.objects_db.pop(object_id, None)
 231    
 232    doboi = del_object_by_object_id
 233    
 234    def adjust_to_serializable(self, type_id: DataType, obj: Any) -> Any:
 235        if DataType.int_ == type_id:
 236            if self.serializable_int:
 237                return obj
 238            elif self.serializable_bytes:
 239                return obj.to_bytes(8, 'little')
 240            elif self.serializable_bytearray:
 241                return bytearray(obj.to_bytes(8, 'little'))
 242            elif self.serializable_str:
 243                return str(obj)
 244            else:
 245                pass
 246        elif DataType.float_ == type_id:
 247            if self.serializable_float:
 248                return obj
 249            elif self.serializable_bytes:
 250                return pack('=d', obj)
 251            elif self.serializable_bytearray:
 252                return bytearray(pack('=d', obj))
 253            elif self.serializable_str:
 254                return str(obj)
 255            else:
 256                pass
 257        elif DataType.complex_ == type_id:
 258            if self.serializable_complex:
 259                return obj
 260            elif self.serializable_bytes:
 261                return pack('=dd', obj.real, obj.imag)
 262            elif self.serializable_bytearray:
 263                return bytearray(pack('=dd', obj.real, obj.imag))
 264            elif self.serializable_str:
 265                return str(obj)
 266            elif self.serializable_float:
 267                if self.serializable_tuple:
 268                    return (obj.real, obj.imag)
 269                elif self.serializable_list:
 270                    return [obj.real, obj.imag]
 271                else:
 272                    pass
 273            else:
 274                pass
 275        elif DataType.str_ == type_id:
 276            if self.serializable_str:
 277                return obj
 278            elif self.serializable_bytes:
 279                return obj.encode('utf-8')
 280            elif self.serializable_bytearray:
 281                return bytearray(obj.encode('utf-8'))
 282            elif self.serializable_int:
 283                if self.serializable_tuple:
 284                    return tuple(ord(c) for c in obj)
 285                elif self.serializable_list:
 286                    return [ord(c) for c in obj]
 287                else:
 288                    pass
 289            elif self.serializable_float:
 290                if self.serializable_tuple:
 291                    return tuple(float(ord(c)) for c in obj)
 292                elif self.serializable_list:
 293                    return [float(ord(c)) for c in obj]
 294                else:
 295                    pass
 296            else:
 297                pass
 298        elif DataType.bytes_ == type_id:
 299            if self.serializable_bytes:
 300                return obj
 301            elif self.serializable_bytearray:
 302                return bytearray(obj)
 303            elif self.serializable_str:
 304                return obj.hex()
 305            elif self.serializable_tuple:
 306                if self.serializable_int:
 307                    return  tuple(int(c) for c in obj)
 308                if self.serializable_float:
 309                    return  tuple(float(int(c)) for c in obj)
 310                else:
 311                    pass
 312            elif self.serializable_list:
 313                if self.serializable_int:
 314                    return  [int(c) for c in obj]
 315                if self.serializable_float:
 316                    return  [float(int(c)) for c in obj]
 317                else:
 318                    pass
 319            else:
 320                pass
 321        elif DataType.bytearray_ == type_id:
 322            if self.serializable_bytearray:
 323                return obj
 324            elif self.serializable_bytes:
 325                return bytes(obj)
 326            elif self.serializable_str:
 327                return obj.hex()
 328            elif self.serializable_tuple:
 329                if self.serializable_int:
 330                    return  tuple(int(c) for c in obj)
 331                if self.serializable_float:
 332                    return  tuple(float(int(c)) for c in obj)
 333                else:
 334                    pass
 335            elif self.serializable_list:
 336                if self.serializable_int:
 337                    return  [int(c) for c in obj]
 338                if self.serializable_float:
 339                    return  [float(int(c)) for c in obj]
 340                else:
 341                    pass
 342            else:
 343                pass
 344        elif DataType.bool_ == type_id:
 345            if self.serializable_bool:
 346                return obj
 347            elif self.serializable_int:
 348                return int(obj)
 349            elif self.serializable_bytes:
 350                return obj.to_bytes(1, 'little')
 351            elif self.serializable_bytearray:
 352                return bytearray(obj.to_bytes(1, 'little'))
 353            elif self.serializable_str:
 354                return str(obj)
 355            elif self.serializable_float:
 356                return float(int(obj))
 357            else:
 358                pass
 359        elif DataType.none_ == type_id:
 360            if self.serializable_none:
 361                return obj
 362            elif self.serializable_bool:
 363                return False
 364            elif self.serializable_int:
 365                return 0
 366            elif self.serializable_bytes:
 367                return b'\x00'
 368            elif self.serializable_bytearray:
 369                return bytearray(b'\x00')
 370            elif self.serializable_str:
 371                return ''
 372            elif self.serializable_float:
 373                return 0.0
 374            else:
 375                pass
 376        elif DataType.list_ == type_id:
 377            if self.serializable_list:
 378                return obj
 379            elif self.serializable_tuple:
 380                return tuple(obj)
 381            elif self.serializable_dict:
 382                return dict({index: item for index, item in enumerate(obj)})
 383            else:
 384                pass
 385        elif DataType.tuple_ == type_id:
 386            if self.serializable_tuple:
 387                return obj
 388            elif self.serializable_list:
 389                return list(obj)
 390            elif self.serializable_dict:
 391                return dict({index: item for index, item in enumerate(obj)})
 392            else:
 393                pass
 394        elif DataType.set_ == type_id:
 395            if self.serializable_set:
 396                return obj
 397            elif self.serializable_frozenset:
 398                return frozenset(obj)
 399            elif self.serializable_tuple:
 400                return tuple(obj)
 401            elif self.serializable_list:
 402                return list(obj)
 403            elif self.serializable_dict:
 404                return dict({k: None for k in obj})
 405            else:
 406                pass
 407        elif DataType.frozenset_ == type_id:
 408            if self.serializable_frozenset:
 409                return obj
 410            elif self.serializable_set:
 411                return set(obj)
 412            elif self.serializable_tuple:
 413                return tuple(obj)
 414            elif self.serializable_list:
 415                return list(obj)
 416            elif self.serializable_dict:
 417                return dict({k: None for k in obj})
 418            else:
 419                pass
 420        elif DataType.dict_ == type_id:
 421            if self.serializable_dict:
 422                return obj
 423            elif self.serializable_tuple:
 424                return tuple(obj.items())
 425            elif self.serializable_list:
 426                return list(list(pair) for pair in obj.items())
 427            else:
 428                pass
 429        elif DataType.slice_ == type_id:
 430            if self.serializable_slice:
 431                return obj
 432            elif self.serializable_tuple:
 433                return (obj.start, obj.stop, obj.step)
 434            elif self.serializable_list:
 435                return [obj.start, obj.stop, obj.step]
 436            elif self.serializable_dict:
 437                return {0: obj.start, 1: obj.stop, 2: obj.step}
 438            else:
 439                pass
 440        else:
 441            raise RuntimeError('Unknown type_id')
 442        
 443        raise CanNotAdjustToSerializableError(f'Can not adjust to serializable. Type: {type_id}, obj: {obj}')
 444
 445    ats = adjust_to_serializable
 446
 447    def adjust_from_serializable(self, type_id: DataType, obj: Any) -> Any:
 448        if DataType.int_ == type_id:
 449            if self.serializable_int:
 450                return obj
 451            elif self.serializable_bytes:
 452                return int.from_bytes(obj, 'little')
 453            elif self.serializable_bytearray:
 454                return int.from_bytes(bytes(obj), 'little')
 455            elif self.serializable_str:
 456                return int(obj)
 457            else:
 458                pass
 459        elif DataType.float_ == type_id:
 460            if self.serializable_float:
 461                return obj
 462            elif self.serializable_bytes:
 463                return unpack('=d', obj)[0]
 464            elif self.serializable_bytearray:
 465                return unpack('=d', bytes(obj))[0]
 466            elif self.serializable_str:
 467                return float(obj)
 468            else:
 469                pass
 470        elif DataType.complex_ == type_id:
 471            if self.serializable_complex:
 472                return obj
 473            elif self.serializable_bytes:
 474                return complex(*unpack('=dd', obj))
 475            elif self.serializable_bytearray:
 476                return complex(*unpack('=dd', bytes(obj)))
 477            elif self.serializable_str:
 478                return complex(*obj)
 479            elif self.serializable_float:
 480                if self.serializable_tuple:
 481                    return complex(*obj)
 482                elif self.serializable_list:
 483                    return complex(*obj)
 484                else:
 485                    pass
 486            else:
 487                pass
 488        elif DataType.str_ == type_id:
 489            if self.serializable_str:
 490                return obj
 491            elif self.serializable_bytes:
 492                return obj.decode('utf-8')
 493            elif self.serializable_bytearray:
 494                return bytes(obj).decode('utf-8')
 495            elif self.serializable_int:
 496                if self.serializable_tuple:
 497                    return ''.join(chr(c) for c in obj)
 498                elif self.serializable_list:
 499                    return ''.join(chr(c) for c in obj)
 500                else:
 501                    pass
 502            elif self.serializable_float:
 503                if self.serializable_tuple:
 504                    return ''.join(chr(int(round(c))) for c in obj)
 505                elif self.serializable_list:
 506                    return ''.join(chr(int(round(c))) for c in obj)
 507                else:
 508                    pass
 509            else:
 510                pass
 511        elif DataType.bytes_ == type_id:
 512            if self.serializable_bytes:
 513                return obj
 514            elif self.serializable_bytearray:
 515                return bytes(obj)
 516            elif self.serializable_str:
 517                return bytes.fromhex(obj)
 518            elif self.serializable_tuple:
 519                if self.serializable_int:
 520                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
 521                if self.serializable_float:
 522                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
 523                else:
 524                    pass
 525            elif self.serializable_list:
 526                if self.serializable_int:
 527                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
 528                if self.serializable_float:
 529                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
 530                else:
 531                    pass
 532            else:
 533                pass
 534        elif DataType.bytearray_ == type_id:
 535            if self.serializable_bytearray:
 536                return obj
 537            elif self.serializable_bytes:
 538                return bytearray(obj)
 539            elif self.serializable_str:
 540                return bytearray(bytes.fromhex(obj))
 541            elif self.serializable_tuple:
 542                if self.serializable_int:
 543                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
 544                if self.serializable_float:
 545                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
 546                else:
 547                    pass
 548            elif self.serializable_list:
 549                if self.serializable_int:
 550                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
 551                if self.serializable_float:
 552                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
 553                else:
 554                    pass
 555            else:
 556                pass
 557        elif DataType.bool_ == type_id:
 558            if self.serializable_bool:
 559                return obj
 560            elif self.serializable_int:
 561                return bool(obj)
 562            elif self.serializable_bytes:
 563                return bool(int.from_bytes(obj, 'little'))
 564            elif self.serializable_bytearray:
 565                return bool(int.from_bytes(bytes(obj), 'little'))
 566            elif self.serializable_str:
 567                return bool(obj)
 568            elif self.serializable_float:
 569                return bool(int(round(obj)))
 570            else:
 571                pass
 572        elif DataType.none_ == type_id:
 573            return None
 574        elif DataType.list_ == type_id:
 575            if self.serializable_list:
 576                return obj
 577            elif self.serializable_tuple:
 578                return list(obj)
 579            elif self.serializable_dict:
 580                return [value for key, value in sorted(obj.items(), key=lambda x: x[0])]
 581            else:
 582                pass
 583        elif DataType.tuple_ == type_id:
 584            if self.serializable_tuple:
 585                return obj
 586            elif self.serializable_list:
 587                return tuple(obj)
 588            elif self.serializable_dict:
 589                return tuple(value for key, value in sorted(obj.items(), key=lambda x: x[0]))
 590            else:
 591                pass
 592        elif DataType.set_ == type_id:
 593            if self.serializable_set:
 594                return obj
 595            elif self.serializable_frozenset:
 596                return set(obj)
 597            elif self.serializable_tuple:
 598                return set(obj)
 599            elif self.serializable_list:
 600                return set(obj)
 601            elif self.serializable_dict:
 602                return set(obj.keys())
 603            else:
 604                pass
 605        elif DataType.frozenset_ == type_id:
 606            if self.serializable_frozenset:
 607                return obj
 608            elif self.serializable_set:
 609                return frozenset(obj)
 610            elif self.serializable_tuple:
 611                return frozenset(obj)
 612            elif self.serializable_list:
 613                return frozenset(obj)
 614            elif self.serializable_dict:
 615                return frozenset(obj.keys())
 616            else:
 617                pass
 618        elif DataType.dict_ == type_id:
 619            if self.serializable_dict:
 620                return obj
 621            elif self.serializable_tuple:
 622                return dict(obj)
 623            elif self.serializable_list:
 624                return dict(obj)
 625            else:
 626                pass
 627        elif DataType.slice_ == type_id:
 628            if self.serializable_slice:
 629                return obj
 630            elif self.serializable_tuple:
 631                return slice(*obj)
 632            elif self.serializable_list:
 633                return slice(*obj)
 634            elif self.serializable_dict:
 635                return slice(obj[0], obj[1], obj[2])
 636            else:
 637                pass
 638        else:
 639            raise RuntimeError('Unknown type_id')
 640        
 641        raise CanNotAdjustFromSerializableError(f'Can not adjust from serializable. Type: {type_id}, obj: {obj}')
 642    
 643    afs = adjust_from_serializable
 644    
 645    # def is_replicatable_object_attribute(self, attribute: Any) -> bool:
 646    #     if is_setable_data_descriptor(attribute):
 647    #         data = attribute.__get__(None, None)
 648    #     elif is_callable(attribute):
 649    #         return False
 650    #     else:
 651    #         return True
 652
 653    def serialize_container(self, type_id: DataType, obj: Any) -> Any:
 654        if DataType.list_ == type_id:
 655            new_obj = list()
 656            for item in obj:
 657                result: ResultExistence[int] = self.serialize_impl(item)
 658                if result:
 659                    new_obj.append(result.value)
 660        elif DataType.tuple_ == type_id:
 661            new_obj = list()
 662            for item in obj:
 663                result: ResultExistence[int] = self.serialize_impl(item)
 664                if result:
 665                    new_obj.append(result.value)
 666            
 667            new_obj = tuple(new_obj)
 668        elif DataType.set_ == type_id:
 669            new_obj = set()
 670            for item in obj:
 671                result: ResultExistence[int] = self.serialize_impl(item)
 672                if result:
 673                    new_obj.add(result.value)
 674        elif DataType.frozenset_ == type_id:
 675            new_obj = set()
 676            for item in obj:
 677                result: ResultExistence[int] = self.serialize_impl(item)
 678                if result:
 679                    new_obj.add(result.value)
 680                
 681            new_obj = frozenset(new_obj)
 682        elif DataType.dict_ == type_id:
 683            new_obj = dict()
 684            for key, value in obj.items():
 685                key_result: ResultExistence[int] = self.serialize_impl(key)
 686                value_result: ResultExistence[int] = self.serialize_impl(value)
 687                if key_result and value_result:
 688                    new_obj[key_result.value] = value_result.value
 689        
 690        return new_obj
 691    
 692    sc = serialize_container
 693
 694    def serialize_impl(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
 695        result_exists: bool = True
 696        id_: int = id(obj)
 697        obj_type = type(obj)
 698        if (int != obj_type) and (id_ in self.objects_ids_by_id):
 699            new_object: bool = False
 700            object_id: int = self.objects_ids_by_id[id_]
 701        else:
 702            # int object must always produce new object_id because first 256 ints are persistent across Python sessions and
 703            # this can cause issues within users of current module. For example within `cengal/hardware/memory/shared_memory`
 704            # which changes int values inline instead of producing new objects.
 705            new_object = True
 706            object_id = self.objects_id_gen()
 707            self.objects_ids[object_id] = id_
 708            self.objects_db[object_id] = obj
 709        
 710        if not new_object:
 711            return ResultExistence[int](result_exists, object_id)
 712
 713        if  self.serializable_any or (obj_type in self.serializable_data_types):
 714            serializable: bool = True
 715            type_id: DataType = data_type_by_type.get(obj_type, DataType.unknown_serializable)
 716        else:
 717            serializable = False
 718            type_id = data_type_by_type.get(obj_type, DataType.class_)
 719        
 720        if obj_type in known_container_types:
 721            known_container: bool = True
 722        else:
 723            known_container = False
 724        
 725        class_info: Dict[int, Any] = None
 726        known_data: bool = None
 727        class_id: int = None
 728        is_new_class: bool = None
 729        class_name: str = None
 730        new_obj_slots: List[Tuple[str, Any]] = None
 731        new_obj_dict: Dict[str, Any] = None
 732        obj_mapping: Dict = None
 733        obj_sequence: List = None
 734        obj_set: Set = None
 735        if serializable:
 736            if known_container:
 737                object_info = (
 738                    self.ats(DataType.int_, object_id),
 739                    self.ats(DataType.int_, type_id.value),
 740                    self.sc(type_id, obj),
 741                )
 742            else:
 743                object_info = (
 744                    self.ats(DataType.int_, object_id),
 745                    self.ats(DataType.int_, type_id.value),
 746                    obj,
 747                )
 748        else:
 749            if obj_type in known_data_types:
 750                known_data = True
 751            else:
 752                known_data = False
 753            
 754            if DataType.class_ == type_id:
 755                new_obj_slots = list()
 756                for slot_name, slot_value in filled_slot_names_with_values_gen(obj):
 757                    # if not hasattr(slot_value, '__set__'):
 758                    #     # if not setable descriptor
 759                    #     continue
 760
 761                    if self.serializable_str:
 762                        adjusted_slot_name = slot_name
 763                    else:
 764                        adjusted_slot_name = self.ats(DataType.str_, slot_name)
 765                    
 766                    item_result: ResultExistence[int] = self.serialize_impl(slot_value)
 767                    if item_result:
 768                        if self.serializable_tuple:
 769                            new_obj_slots.append((adjusted_slot_name, item_result.value))
 770                        elif self.serializable_list:
 771                            new_obj_slots.append([adjusted_slot_name, item_result.value])
 772                        else:
 773                            new_obj_slots.append(self.ats(DataType.tuple_, (adjusted_slot_name, item_result.value)))
 774                
 775                if new_obj_slots:
 776                    if self.serializable_list:
 777                        pass
 778                    elif self.serializable_tuple:
 779                        new_obj_slots = tuple(new_obj_slots)
 780                    else:
 781                        new_obj_slots = self.ats(DataType.list_, new_obj_slots)
 782                
 783                new_obj_dict = dict()
 784                if hasattr(obj, '__dict__'):
 785                    for key, value in obj.__dict__.items():
 786                        # raw_value = getattr_static(obj, key)
 787                        # if hasattr(raw_value, '__get__') and (not hasattr(raw_value, '__set__')):
 788                        #     # if not setable descriptor
 789                        #     continue
 790
 791                        if self.serializable_str:
 792                            adjusted_key = key
 793                        else:
 794                            adjusted_key = self.ats(DataType.str_, key)
 795
 796                        value_result: ResultExistence[int] = self.serialize_impl(value)
 797                        if value_result:
 798                            new_obj_dict[adjusted_key] = value_result.value
 799                        else:
 800                            continue
 801                
 802                    if new_obj_dict:
 803                        if self.serializable_dict:
 804                            pass
 805                        else:
 806                            new_obj_dict = self.ats(DataType.dict_, new_obj_dict)
 807                
 808                obj_mapping = dict()
 809                obj_sequence = list()
 810                obj_set = set()
 811                if isinstance(obj, MutableMapping):
 812                    for key, value in obj.items():
 813                        key_result: ResultExistence[int] = self.serialize_impl(value)
 814                        if not key_result:
 815                            continue
 816
 817                        value_result: ResultExistence[int] = self.serialize_impl(value)
 818                        if value_result:
 819                            obj_mapping[key_result.value] = value_result.value
 820                        else:
 821                            continue
 822                    
 823                    if obj_mapping:
 824                        if self.serializable_dict:
 825                            pass
 826                        else:
 827                            obj_mapping = self.ats(DataType.dict_, obj_mapping)
 828                elif isinstance(obj, MutableSequence):
 829                    for item in obj:
 830                        item_result: ResultExistence[int] = self.serialize_impl(item)
 831                        if item_result:
 832                            obj_sequence.append(item_result.value)
 833                        else:
 834                            continue
 835                    
 836                    if obj_sequence:
 837                        if self.serializable_list:
 838                            pass
 839                        else:
 840                            obj_sequence = self.ats(DataType.list_, obj_sequence)
 841                elif isinstance(obj, MutableSet):
 842                    for item in obj:
 843                        item_result: ResultExistence[int] = self.serialize_impl(item)
 844                        if item_result:
 845                            obj_set.add(item_result.value)
 846                        else:
 847                            continue
 848                    
 849                    if obj_set:
 850                        if self.serializable_set:
 851                            pass
 852                        else:
 853                            obj_set = self.ats(DataType.set_, obj_set)
 854                else:
 855                    pass
 856
 857                if ignore_empty_classes:
 858                    result_exists = new_obj_slots or new_obj_dict or obj_mapping or obj_sequence or obj_set
 859                
 860                if obj_type in self.known_classes:
 861                    is_new_class = False
 862                    class_id = self.known_classes[obj_type]
 863                else:
 864                    class_info = dict()
 865                    is_new_class = True
 866                    class_name = obj_type.__name__
 867                    class_id = self.classes_id_gen()
 868                    self.known_classes[obj_type] = class_id
 869                    self.known_classes_by_id[class_id] = obj_type
 870                    module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(obj)
 871                    adjusted_owning_names_path: List[str] = [self.ats(DataType.str_, name) for name in owning_names_path]
 872                    module_importable_str_and_owning_names_path = (class_name, module_importable_str, tuple(owning_names_path))
 873                    self.known_classes_info[module_importable_str_and_owning_names_path] = class_id
 874                    self.known_classes_info_by_id[class_id] = module_importable_str_and_owning_names_path
 875
 876                    if result_exists:
 877                        class_info = (
 878                            self.ats(DataType.int_, class_id),
 879                            self.ats(DataType.str_, class_name),
 880                            self.ats(DataType.str_, module_importable_str),
 881                            self.ats(DataType.list_, adjusted_owning_names_path),
 882                        )
 883
 884                        if self.serializable_tuple:
 885                            adjusted_class_info = class_info
 886                        else:
 887                            adjusted_class_info = self.ats(DataType.tuple_, class_info)
 888                        
 889                        if self.on_new_class_handler:
 890                            self.on_new_class_handler(
 891                                adjusted_class_info,
 892                                obj_type,
 893                                class_id,
 894                                class_name,
 895                                module_importable_str,
 896                                owning_names_path,
 897                                module_importable_str_and_owning_names_path
 898                            )
 899
 900                # will be later serialized much faster than without `if else None`
 901                object_info = (
 902                    self.ats(DataType.int_, object_id),
 903                    self.ats(DataType.int_, type_id.value),
 904                    self.ats(DataType.none_, None),
 905                    self.ats(DataType.int_, class_id),
 906                    new_obj_slots if new_obj_slots else self.ats(DataType.list_, list()),
 907                    new_obj_dict if new_obj_dict else self.ats(DataType.dict_, dict()),
 908                    obj_mapping if obj_mapping else self.ats(DataType.dict_, dict()),
 909                    obj_sequence if obj_sequence else self.ats(DataType.list_, list()),
 910                    obj_set if obj_set else self.ats(DataType.set_, set()),
 911                )
 912            elif known_data:
 913                object_info = (
 914                    self.ats(DataType.int_, object_id),
 915                    self.ats(DataType.int_, type_id.value),
 916                    self.ats(type_id, obj),
 917                )
 918            elif known_container:
 919                object_info = (
 920                    self.ats(DataType.int_, object_id),
 921                    self.ats(DataType.int_, type_id.value),
 922                    self.ats(type_id, self.sc(type_id, obj)),
 923                )
 924            else:
 925                raise RuntimeError('Unknown type_id')
 926
 927        if self.serializable_tuple:
 928            adjusted_object_info = object_info
 929        else:
 930            adjusted_object_info = self.ats(DataType.tuple_, object_info)
 931        
 932        if result_exists:
 933            if self.on_new_obj_info_handler:
 934                self.on_new_obj_info_handler(
 935                    adjusted_object_info,
 936                    obj,
 937                    object_id,
 938                    type_id,
 939                    serializable,
 940                    known_container,
 941                    known_data,
 942                    class_id,
 943                    is_new_class,
 944                    new_obj_slots,
 945                    new_obj_dict,
 946                    obj_mapping,
 947                    obj_sequence,
 948                    obj_set,
 949                )
 950        
 951        return ResultExistence[int](result_exists, object_id)
 952    
 953    si = serialize_impl
 954
 955    def serialize(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
 956        with DisableGC():
 957            return self.serialize_impl(obj, ignore_empty_classes)
 958    
 959    s = serialize
 960    
 961    def deserialize_class_impl(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
 962        if self.serializable_tuple:
 963            pass
 964        else:
 965            class_info = self.afs(DataType.tuple_, class_info)
 966
 967        class_id: int = self.afs(DataType.int_, class_info[ClassInfoFields.class_id.value])
 968        if class_id in self.known_classes_by_id:
 969            return ResultExistence[Tuple[int, Type]](True, (class_id, self.known_classes_by_id[class_id]))
 970        else:
 971            class_name: str = self.afs(DataType.str_, class_info[ClassInfoFields.class_name.value])
 972            module_importable_str: str = self.afs(DataType.str_, class_info[ClassInfoFields.module_importable_str.value])
 973            owning_names_path: List[str] = self.afs(DataType.list_, class_info[ClassInfoFields.owning_names_path.value])
 974            adjusted_owning_names_path: List[str] = [self.afs(DataType.str_, name) for name in owning_names_path]
 975            obj_class: Type = entity_by_name_module_importable_str_and_owning_names_path(class_name, module_importable_str, adjusted_owning_names_path)
 976            self.known_classes_by_id[class_id] = obj_class
 977            self.known_classes[obj_class] = class_id
 978            class_info_tuple: Tuple = (class_name, module_importable_str, tuple(owning_names_path)) 
 979            self.known_classes_info[class_info_tuple] = class_id
 980            self.known_classes_info_by_id[class_id] = class_info_tuple
 981            return ResultExistence[Tuple[int, Type]](True, (class_id, obj_class))
 982    
 983    dcli = deserialize_class_impl
 984    
 985    def deserialize_class(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
 986        with DisableGC():
 987            return self.deserialize_class_impl(class_info)
 988    
 989    dcl = deserialize_class
 990
 991    def deserialize_container_impl(self, type_id: DataType, obj: Any) -> Any:
 992        new_obj = obj
 993        if DataType.list_ == type_id:
 994            new_obj = list()
 995            for item_id in obj:
 996                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
 997        elif DataType.tuple_ == type_id:
 998            new_obj = list()
 999            for item_id in obj:
1000                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
1001            
1002            new_obj = tuple(new_obj)
1003        elif DataType.set_ == type_id:
1004            new_obj = set()
1005            for item_id in obj:
1006                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1007        elif DataType.frozenset_ == type_id:
1008            new_obj = set()
1009            for item_id in obj:
1010                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1011                
1012            new_obj = frozenset(new_obj)
1013        elif DataType.dict_ == type_id:
1014            new_obj = dict()
1015            for key_id, value_id in obj.items():
1016                new_obj[self.objects_db[int(self.afs(DataType.int_, key_id))]] = self.objects_db[self.afs(DataType.int_, value_id)]
1017        
1018        return new_obj
1019    
1020    dcoi = deserialize_container_impl
1021
1022    def deserialize_container(self, type_id: DataType, obj: Any) -> Any:
1023        with DisableGC():
1024            return self.deserialize_container_impl(type_id, obj)
1025    
1026    dco = deserialize_container
1027
1028    def deserialize_obj_impl(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1029        if self.serializable_tuple:
1030            pass
1031        else:
1032            obj_info = self.afs(DataType.tuple_, obj_info)
1033        
1034        object_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.object_id.value])
1035        if object_id in self.objects_db:
1036            return ResultExistence[Tuple[int, Any]](True, (object_id, self.objects_db[object_id]))
1037        
1038        type_id: DataType = DataType(self.afs(DataType.int_, obj_info[ObjectInfoFields.type_id.value]))
1039        
1040        obj_type = data_type[type_id] 
1041        serializable: bool = self.serializable_any or (obj_type in self.serializable_data_types)
1042        known_container: bool = obj_type in known_container_types
1043        known_data: bool = None
1044        
1045        if serializable:
1046            if known_container:
1047                obj = self.dcoi(type_id, obj_info[ObjectInfoFields.object_.value])
1048            else:
1049                obj = obj_info[ObjectInfoFields.object_.value]
1050        else:
1051            known_data = obj_type in known_data_types
1052            
1053            if DataType.class_ == type_id:
1054                class_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.class_id.value])
1055                obj_class: Type = self.known_classes_by_id[class_id]
1056                obj: Any = obj_class.__new__(obj_class)
1057
1058                if obj_info[ObjectInfoFields.clonable_slots.value]:
1059                    clonable_slots = self.afs(DataType.list_, obj_info[ObjectInfoFields.clonable_slots.value])
1060                    for slot_name, slot_id in clonable_slots:
1061                        slot_name = self.afs(DataType.str_, slot_name)
1062                        slot_id = self.afs(DataType.int_, slot_id)
1063                        child_obj = self.objects_db[slot_id]
1064                        setattr(obj, slot_name, child_obj)
1065                
1066                if obj_info[ObjectInfoFields.clonable_dict_items.value]:
1067                    clonable_dict_items = self.afs(DataType.dict_, obj_info[ObjectInfoFields.clonable_dict_items.value])
1068                    for key, value_id in clonable_dict_items.items():
1069                        key = self.afs(DataType.str_, key)
1070                        value_id = self.afs(DataType.int_, value_id)
1071                        child_obj = self.objects_db[value_id]
1072                        setattr(obj, key, child_obj)
1073                
1074                if obj_info[ObjectInfoFields.contained_mapping.value]:
1075                    contained_mapping = self.afs(DataType.dict_, obj_info[ObjectInfoFields.contained_mapping.value])
1076                    for key_id, value_id in contained_mapping.items():
1077                        key_id = self.afs(DataType.int_, key_id)
1078                        value_id = self.afs(DataType.int_, value_id)
1079                        child_key = self.objects_db[int(key_id)]
1080                        child_value = self.objects_db[value_id]
1081                        obj[child_key] = child_value
1082                
1083                if obj_info[ObjectInfoFields.contained_sequence.value]:
1084                    contained_sequence = self.afs(DataType.list_, obj_info[ObjectInfoFields.contained_sequence.value])
1085                    for item_id in contained_sequence:
1086                        item_id = self.afs(DataType.int_, item_id)
1087                        child_item = self.objects_db[item_id]
1088                        obj.append(child_item)
1089                
1090                if obj_info[ObjectInfoFields.contained_set.value]:
1091                    contained_set = self.afs(DataType.set_, obj_info[ObjectInfoFields.contained_set.value])
1092                    for item_id in contained_set:
1093                        item_id = self.afs(DataType.int_, item_id)
1094                        child_item = self.objects_db[item_id]
1095                        obj.add(child_item)
1096            elif known_data:
1097                obj = self.afs(type_id, obj_info[ObjectInfoFields.object_.value])
1098            elif known_container:
1099                obj = self.dcoi(type_id, self.afs(type_id, obj_info[ObjectInfoFields.object_.value]))
1100            else:
1101                raise RuntimeError('Unknown type_id')
1102        
1103        self.objects_db[object_id] = obj
1104        id_: int = id(obj)
1105        self.objects_ids[object_id] = id_
1106        self.objects_ids_by_id[id_] = object_id
1107        return ResultExistence[Tuple[int, Any]](True, (object_id, obj))
1108    
1109    doi = deserialize_obj_impl
1110
1111    def deserialize_obj(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1112        with DisableGC():
1113            return self.deserialize_obj_impl(obj_info)
1114    
1115    do = deserialize_obj
default_serializable_data_types: Set[Type] = {<class 'int'>, <class 'complex'>, <class 'NoneType'>, <class 'list'>, <class 'frozenset'>, <class 'bytes'>, <class 'str'>, <class 'tuple'>, <class 'dict'>, <class 'float'>, <class 'set'>, <class 'bool'>, <class 'bytearray'>}
known_types: Set[Type] = {<class 'int'>, <class 'complex'>, <class 'NoneType'>, <class 'list'>, <class 'frozenset'>, <class 'bytes'>, <class 'str'>, <class 'tuple'>, <class 'dict'>, <class 'float'>, <class 'set'>, <class 'slice'>, <class 'bool'>, <class 'bytearray'>}
known_data_types: Set[Type] = {<class 'int'>, <class 'NoneType'>, <class 'bytes'>, <class 'str'>, <class 'float'>, <class 'slice'>, <class 'bool'>, <class 'bytearray'>}
known_container_types: Set[Type] = {<class 'complex'>, <class 'list'>, <class 'tuple'>, <class 'dict'>, <class 'set'>, <class 'frozenset'>}
class DataType(enum.IntEnum):
 91class DataType(IntEnum):
 92    class_ = 0  # type is not in known_types and not in serializable_data_types
 93    int_ = 1
 94    float_ = 2
 95    complex_ = 3
 96    str_ = 4
 97    bytes_ = 5
 98    bytearray_ = 6
 99    bool_ = 7
100    none_ = 8
101    list_ = 9
102    tuple_ = 10
103    set_ = 11
104    frozenset_ = 12
105    dict_ = 13
106    slice_ = 14
107    unknown_serializable = 15  # type is in serializable_data_types but not in known_types

An enumeration.

class_ = <DataType.class_: 0>
int_ = <DataType.int_: 1>
float_ = <DataType.float_: 2>
complex_ = <DataType.complex_: 3>
str_ = <DataType.str_: 4>
bytes_ = <DataType.bytes_: 5>
bytearray_ = <DataType.bytearray_: 6>
bool_ = <DataType.bool_: 7>
none_ = <DataType.none_: 8>
list_ = <DataType.list_: 9>
tuple_ = <DataType.tuple_: 10>
set_ = <DataType.set_: 11>
frozenset_ = <DataType.frozenset_: 12>
dict_ = <DataType.dict_: 13>
slice_ = <DataType.slice_: 14>
unknown_serializable = <DataType.unknown_serializable: 15>
Inherited Members
enum.Enum
name
value
builtins.int
conjugate
bit_length
to_bytes
from_bytes
as_integer_ratio
real
imag
numerator
denominator
data_type: Dict[DataType, Type] = {<DataType.class_: 0>: <class 'object'>, <DataType.int_: 1>: <class 'int'>, <DataType.float_: 2>: <class 'float'>, <DataType.complex_: 3>: <class 'complex'>, <DataType.str_: 4>: <class 'str'>, <DataType.bytes_: 5>: <class 'bytes'>, <DataType.bytearray_: 6>: <class 'bytearray'>, <DataType.bool_: 7>: <class 'bool'>, <DataType.none_: 8>: <class 'NoneType'>, <DataType.list_: 9>: <class 'list'>, <DataType.tuple_: 10>: <class 'tuple'>, <DataType.set_: 11>: <class 'set'>, <DataType.frozenset_: 12>: <class 'frozenset'>, <DataType.dict_: 13>: <class 'dict'>, <DataType.slice_: 14>: <class 'slice'>, <DataType.unknown_serializable: 15>: None}
data_type_by_type: Dict[Type, DataType] = {<class 'object'>: <DataType.class_: 0>, <class 'int'>: <DataType.int_: 1>, <class 'float'>: <DataType.float_: 2>, <class 'complex'>: <DataType.complex_: 3>, <class 'str'>: <DataType.str_: 4>, <class 'bytes'>: <DataType.bytes_: 5>, <class 'bytearray'>: <DataType.bytearray_: 6>, <class 'bool'>: <DataType.bool_: 7>, <class 'NoneType'>: <DataType.none_: 8>, <class 'list'>: <DataType.list_: 9>, <class 'tuple'>: <DataType.tuple_: 10>, <class 'set'>: <DataType.set_: 11>, <class 'frozenset'>: <DataType.frozenset_: 12>, <class 'dict'>: <DataType.dict_: 13>, <class 'slice'>: <DataType.slice_: 14>, None: <DataType.unknown_serializable: 15>}
class ClassInfoFields(enum.IntEnum):
150class ClassInfoFields(IntEnum):
151    class_id = 0
152    class_name = 1
153    module_importable_str = 2
154    owning_names_path = 3

An enumeration.

class_id = <ClassInfoFields.class_id: 0>
class_name = <ClassInfoFields.class_name: 1>
module_importable_str = <ClassInfoFields.module_importable_str: 2>
owning_names_path = <ClassInfoFields.owning_names_path: 3>
Inherited Members
enum.Enum
name
value
builtins.int
conjugate
bit_length
to_bytes
from_bytes
as_integer_ratio
real
imag
numerator
denominator
class ObjectInfoFields(enum.IntEnum):
157class ObjectInfoFields(IntEnum):
158    object_id = 0  # (type: int)
159    type_id = 1  # (type: DataType)
160    object_ = 2  # (Optional), (type: Any). Link to object itself if `(type(obj) in serializable_data_types)`. Not used otherwise.
161    class_id = 3  # (Optional), (type: int). Used if `type_id == DataType.class_`
162    clonable_slots = 4  # (Optional), (type: Tuple[Tuple[str, Any]]). Used if `type_id == DataType.class_`. Holds ID's (object_id) of slots objects.
163    clonable_dict_items = 5  # (Optional), (type: Tuple[Tuple[str, Any]]). Used if `type_id == DataType.class_`. Holds ID's (object_id) of value objects.
164    # contained_items = 6  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
165    contained_mapping = 6  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
166    contained_sequence = 7  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).
167    contained_set = 8  # (Optional), (type: Union[Tuple, List, Set, FrozenSet, Dict]). Used if `type_id in {DataType.list_, DataType.tuple_, DataType.set_, DataType.frozenset_, DataType.dict_, DataType.slice_}`. Holds ID's (object_id) of contained items (for bothe keys and values in the case of Dict).

An enumeration.

object_id = <ObjectInfoFields.object_id: 0>
type_id = <ObjectInfoFields.type_id: 1>
object_ = <ObjectInfoFields.object_: 2>
class_id = <ObjectInfoFields.class_id: 3>
clonable_slots = <ObjectInfoFields.clonable_slots: 4>
clonable_dict_items = <ObjectInfoFields.clonable_dict_items: 5>
contained_mapping = <ObjectInfoFields.contained_mapping: 6>
contained_sequence = <ObjectInfoFields.contained_sequence: 7>
contained_set = <ObjectInfoFields.contained_set: 8>
Inherited Members
enum.Enum
name
value
builtins.int
conjugate
bit_length
to_bytes
from_bytes
as_integer_ratio
real
imag
numerator
denominator
class CanNotAdjustToSerializableError(builtins.Exception):
170class CanNotAdjustToSerializableError(Exception):
171    pass

Common base class for all non-exit exceptions.

Inherited Members
builtins.Exception
Exception
builtins.BaseException
with_traceback
args
class CanNotAdjustFromSerializableError(builtins.Exception):
174class CanNotAdjustFromSerializableError(Exception):
175    pass

Common base class for all non-exit exceptions.

Inherited Members
builtins.Exception
Exception
builtins.BaseException
with_traceback
args
class RemoteObjectsManager:
 178class RemoteObjectsManager:
 179    def __init__(self, 
 180                 on_new_class_handler: Optional[Callable] = None,
 181                 on_new_obj_info_handler: Optional[Callable] = None,
 182                 # classess_db: Optional[Dict[int, Type]] = None, 
 183                 objects_db: Optional[Dict[int, Any]] = None, 
 184                 classes_id_gen: Optional[Callable] = None,
 185                 objects_id_gen: Optional[Callable] = None,
 186                 serializable_data_types: Optional[Set[Type]] = None,
 187                 ) -> None:
 188        # self.classess_db: Dict[int, Type] = dict() if classess_db is None else classess_db
 189        self.classes_id_gen: IDGenerator = IDGenerator() if classes_id_gen is None else classes_id_gen
 190        self.objects_db: Dict[int, Any] = dict() if objects_db is None else objects_db
 191        self.objects_id_gen: IDGenerator = IDGenerator() if objects_id_gen is None else objects_id_gen
 192        self.serializable_data_types: Set[Type] = default_serializable_data_types if serializable_data_types is None else serializable_data_types
 193        self.serializable_any: bool = not self.serializable_data_types
 194        self.serializable_int: bool = (int in self.serializable_data_types) or self.serializable_any
 195        self.serializable_float: bool = (float in self.serializable_data_types) or self.serializable_any
 196        self.serializable_complex: bool = (complex in self.serializable_data_types) or self.serializable_any
 197        self.serializable_str: bool = (str in self.serializable_data_types) or self.serializable_any
 198        self.serializable_bytes: bool = (bytes in self.serializable_data_types) or self.serializable_any
 199        self.serializable_bytearray: bool = (bytearray in self.serializable_data_types) or self.serializable_any
 200        self.serializable_bool: bool = (bool in self.serializable_data_types) or self.serializable_any
 201        self.serializable_none: bool = (type(None) in self.serializable_data_types) or self.serializable_any
 202        self.serializable_list: bool = (list in self.serializable_data_types) or self.serializable_any
 203        self.serializable_tuple: bool = (tuple in self.serializable_data_types) or self.serializable_any
 204        self.serializable_set: bool = (set in self.serializable_data_types) or self.serializable_any
 205        self.serializable_frozenset: bool = (frozenset in self.serializable_data_types) or self.serializable_any
 206        self.serializable_dict: bool = (dict in self.serializable_data_types) or self.serializable_any
 207        self.serializable_slice: bool = (slice in self.serializable_data_types) or self.serializable_any
 208        self.known_classes: Dict[Type, int] = dict()
 209        self.known_classes_by_id: Dict[int, Type] = dict()
 210        self.known_classes_info: Dict[Tuple, int] = dict()
 211        self.known_classes_info_by_id: Dict[int, Tuple] = dict()
 212        self.on_new_class_handler: Optional[Callable] = on_new_class_handler
 213        self.on_new_obj_info_handler: Optional[Callable] = on_new_obj_info_handler
 214        self.objects_ids: Dict[int, int] = dict()  # (Key: object_id, Value: id(obj))
 215        self.objects_ids_by_id: Dict[int, int] = dict()  # (Key: id(obj), Value: object_id)
 216
 217    def del_object_by_id(self, id_: int) -> None:
 218        if id_ in self.objects_ids_by_id:
 219            object_id = self.objects_ids_by_id[id_]
 220            self.objects_ids_by_id.pop(id_, None)
 221            self.objects_ids.pop(object_id, None)
 222            self.objects_db.pop(object_id, None)
 223    
 224    dobi = del_object_by_id
 225    
 226    def del_object_by_object_id(self, object_id: int) -> None:
 227        if object_id in self.objects_ids:
 228            id_ = self.objects_ids[object_id]
 229            self.objects_ids_by_id.pop(id_, None)
 230            self.objects_ids.pop(object_id, None)
 231            self.objects_db.pop(object_id, None)
 232    
 233    doboi = del_object_by_object_id
 234    
 235    def adjust_to_serializable(self, type_id: DataType, obj: Any) -> Any:
 236        if DataType.int_ == type_id:
 237            if self.serializable_int:
 238                return obj
 239            elif self.serializable_bytes:
 240                return obj.to_bytes(8, 'little')
 241            elif self.serializable_bytearray:
 242                return bytearray(obj.to_bytes(8, 'little'))
 243            elif self.serializable_str:
 244                return str(obj)
 245            else:
 246                pass
 247        elif DataType.float_ == type_id:
 248            if self.serializable_float:
 249                return obj
 250            elif self.serializable_bytes:
 251                return pack('=d', obj)
 252            elif self.serializable_bytearray:
 253                return bytearray(pack('=d', obj))
 254            elif self.serializable_str:
 255                return str(obj)
 256            else:
 257                pass
 258        elif DataType.complex_ == type_id:
 259            if self.serializable_complex:
 260                return obj
 261            elif self.serializable_bytes:
 262                return pack('=dd', obj.real, obj.imag)
 263            elif self.serializable_bytearray:
 264                return bytearray(pack('=dd', obj.real, obj.imag))
 265            elif self.serializable_str:
 266                return str(obj)
 267            elif self.serializable_float:
 268                if self.serializable_tuple:
 269                    return (obj.real, obj.imag)
 270                elif self.serializable_list:
 271                    return [obj.real, obj.imag]
 272                else:
 273                    pass
 274            else:
 275                pass
 276        elif DataType.str_ == type_id:
 277            if self.serializable_str:
 278                return obj
 279            elif self.serializable_bytes:
 280                return obj.encode('utf-8')
 281            elif self.serializable_bytearray:
 282                return bytearray(obj.encode('utf-8'))
 283            elif self.serializable_int:
 284                if self.serializable_tuple:
 285                    return tuple(ord(c) for c in obj)
 286                elif self.serializable_list:
 287                    return [ord(c) for c in obj]
 288                else:
 289                    pass
 290            elif self.serializable_float:
 291                if self.serializable_tuple:
 292                    return tuple(float(ord(c)) for c in obj)
 293                elif self.serializable_list:
 294                    return [float(ord(c)) for c in obj]
 295                else:
 296                    pass
 297            else:
 298                pass
 299        elif DataType.bytes_ == type_id:
 300            if self.serializable_bytes:
 301                return obj
 302            elif self.serializable_bytearray:
 303                return bytearray(obj)
 304            elif self.serializable_str:
 305                return obj.hex()
 306            elif self.serializable_tuple:
 307                if self.serializable_int:
 308                    return  tuple(int(c) for c in obj)
 309                if self.serializable_float:
 310                    return  tuple(float(int(c)) for c in obj)
 311                else:
 312                    pass
 313            elif self.serializable_list:
 314                if self.serializable_int:
 315                    return  [int(c) for c in obj]
 316                if self.serializable_float:
 317                    return  [float(int(c)) for c in obj]
 318                else:
 319                    pass
 320            else:
 321                pass
 322        elif DataType.bytearray_ == type_id:
 323            if self.serializable_bytearray:
 324                return obj
 325            elif self.serializable_bytes:
 326                return bytes(obj)
 327            elif self.serializable_str:
 328                return obj.hex()
 329            elif self.serializable_tuple:
 330                if self.serializable_int:
 331                    return  tuple(int(c) for c in obj)
 332                if self.serializable_float:
 333                    return  tuple(float(int(c)) for c in obj)
 334                else:
 335                    pass
 336            elif self.serializable_list:
 337                if self.serializable_int:
 338                    return  [int(c) for c in obj]
 339                if self.serializable_float:
 340                    return  [float(int(c)) for c in obj]
 341                else:
 342                    pass
 343            else:
 344                pass
 345        elif DataType.bool_ == type_id:
 346            if self.serializable_bool:
 347                return obj
 348            elif self.serializable_int:
 349                return int(obj)
 350            elif self.serializable_bytes:
 351                return obj.to_bytes(1, 'little')
 352            elif self.serializable_bytearray:
 353                return bytearray(obj.to_bytes(1, 'little'))
 354            elif self.serializable_str:
 355                return str(obj)
 356            elif self.serializable_float:
 357                return float(int(obj))
 358            else:
 359                pass
 360        elif DataType.none_ == type_id:
 361            if self.serializable_none:
 362                return obj
 363            elif self.serializable_bool:
 364                return False
 365            elif self.serializable_int:
 366                return 0
 367            elif self.serializable_bytes:
 368                return b'\x00'
 369            elif self.serializable_bytearray:
 370                return bytearray(b'\x00')
 371            elif self.serializable_str:
 372                return ''
 373            elif self.serializable_float:
 374                return 0.0
 375            else:
 376                pass
 377        elif DataType.list_ == type_id:
 378            if self.serializable_list:
 379                return obj
 380            elif self.serializable_tuple:
 381                return tuple(obj)
 382            elif self.serializable_dict:
 383                return dict({index: item for index, item in enumerate(obj)})
 384            else:
 385                pass
 386        elif DataType.tuple_ == type_id:
 387            if self.serializable_tuple:
 388                return obj
 389            elif self.serializable_list:
 390                return list(obj)
 391            elif self.serializable_dict:
 392                return dict({index: item for index, item in enumerate(obj)})
 393            else:
 394                pass
 395        elif DataType.set_ == type_id:
 396            if self.serializable_set:
 397                return obj
 398            elif self.serializable_frozenset:
 399                return frozenset(obj)
 400            elif self.serializable_tuple:
 401                return tuple(obj)
 402            elif self.serializable_list:
 403                return list(obj)
 404            elif self.serializable_dict:
 405                return dict({k: None for k in obj})
 406            else:
 407                pass
 408        elif DataType.frozenset_ == type_id:
 409            if self.serializable_frozenset:
 410                return obj
 411            elif self.serializable_set:
 412                return set(obj)
 413            elif self.serializable_tuple:
 414                return tuple(obj)
 415            elif self.serializable_list:
 416                return list(obj)
 417            elif self.serializable_dict:
 418                return dict({k: None for k in obj})
 419            else:
 420                pass
 421        elif DataType.dict_ == type_id:
 422            if self.serializable_dict:
 423                return obj
 424            elif self.serializable_tuple:
 425                return tuple(obj.items())
 426            elif self.serializable_list:
 427                return list(list(pair) for pair in obj.items())
 428            else:
 429                pass
 430        elif DataType.slice_ == type_id:
 431            if self.serializable_slice:
 432                return obj
 433            elif self.serializable_tuple:
 434                return (obj.start, obj.stop, obj.step)
 435            elif self.serializable_list:
 436                return [obj.start, obj.stop, obj.step]
 437            elif self.serializable_dict:
 438                return {0: obj.start, 1: obj.stop, 2: obj.step}
 439            else:
 440                pass
 441        else:
 442            raise RuntimeError('Unknown type_id')
 443        
 444        raise CanNotAdjustToSerializableError(f'Can not adjust to serializable. Type: {type_id}, obj: {obj}')
 445
 446    ats = adjust_to_serializable
 447
 448    def adjust_from_serializable(self, type_id: DataType, obj: Any) -> Any:
 449        if DataType.int_ == type_id:
 450            if self.serializable_int:
 451                return obj
 452            elif self.serializable_bytes:
 453                return int.from_bytes(obj, 'little')
 454            elif self.serializable_bytearray:
 455                return int.from_bytes(bytes(obj), 'little')
 456            elif self.serializable_str:
 457                return int(obj)
 458            else:
 459                pass
 460        elif DataType.float_ == type_id:
 461            if self.serializable_float:
 462                return obj
 463            elif self.serializable_bytes:
 464                return unpack('=d', obj)[0]
 465            elif self.serializable_bytearray:
 466                return unpack('=d', bytes(obj))[0]
 467            elif self.serializable_str:
 468                return float(obj)
 469            else:
 470                pass
 471        elif DataType.complex_ == type_id:
 472            if self.serializable_complex:
 473                return obj
 474            elif self.serializable_bytes:
 475                return complex(*unpack('=dd', obj))
 476            elif self.serializable_bytearray:
 477                return complex(*unpack('=dd', bytes(obj)))
 478            elif self.serializable_str:
 479                return complex(*obj)
 480            elif self.serializable_float:
 481                if self.serializable_tuple:
 482                    return complex(*obj)
 483                elif self.serializable_list:
 484                    return complex(*obj)
 485                else:
 486                    pass
 487            else:
 488                pass
 489        elif DataType.str_ == type_id:
 490            if self.serializable_str:
 491                return obj
 492            elif self.serializable_bytes:
 493                return obj.decode('utf-8')
 494            elif self.serializable_bytearray:
 495                return bytes(obj).decode('utf-8')
 496            elif self.serializable_int:
 497                if self.serializable_tuple:
 498                    return ''.join(chr(c) for c in obj)
 499                elif self.serializable_list:
 500                    return ''.join(chr(c) for c in obj)
 501                else:
 502                    pass
 503            elif self.serializable_float:
 504                if self.serializable_tuple:
 505                    return ''.join(chr(int(round(c))) for c in obj)
 506                elif self.serializable_list:
 507                    return ''.join(chr(int(round(c))) for c in obj)
 508                else:
 509                    pass
 510            else:
 511                pass
 512        elif DataType.bytes_ == type_id:
 513            if self.serializable_bytes:
 514                return obj
 515            elif self.serializable_bytearray:
 516                return bytes(obj)
 517            elif self.serializable_str:
 518                return bytes.fromhex(obj)
 519            elif self.serializable_tuple:
 520                if self.serializable_int:
 521                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
 522                if self.serializable_float:
 523                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
 524                else:
 525                    pass
 526            elif self.serializable_list:
 527                if self.serializable_int:
 528                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
 529                if self.serializable_float:
 530                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
 531                else:
 532                    pass
 533            else:
 534                pass
 535        elif DataType.bytearray_ == type_id:
 536            if self.serializable_bytearray:
 537                return obj
 538            elif self.serializable_bytes:
 539                return bytearray(obj)
 540            elif self.serializable_str:
 541                return bytearray(bytes.fromhex(obj))
 542            elif self.serializable_tuple:
 543                if self.serializable_int:
 544                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
 545                if self.serializable_float:
 546                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
 547                else:
 548                    pass
 549            elif self.serializable_list:
 550                if self.serializable_int:
 551                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
 552                if self.serializable_float:
 553                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
 554                else:
 555                    pass
 556            else:
 557                pass
 558        elif DataType.bool_ == type_id:
 559            if self.serializable_bool:
 560                return obj
 561            elif self.serializable_int:
 562                return bool(obj)
 563            elif self.serializable_bytes:
 564                return bool(int.from_bytes(obj, 'little'))
 565            elif self.serializable_bytearray:
 566                return bool(int.from_bytes(bytes(obj), 'little'))
 567            elif self.serializable_str:
 568                return bool(obj)
 569            elif self.serializable_float:
 570                return bool(int(round(obj)))
 571            else:
 572                pass
 573        elif DataType.none_ == type_id:
 574            return None
 575        elif DataType.list_ == type_id:
 576            if self.serializable_list:
 577                return obj
 578            elif self.serializable_tuple:
 579                return list(obj)
 580            elif self.serializable_dict:
 581                return [value for key, value in sorted(obj.items(), key=lambda x: x[0])]
 582            else:
 583                pass
 584        elif DataType.tuple_ == type_id:
 585            if self.serializable_tuple:
 586                return obj
 587            elif self.serializable_list:
 588                return tuple(obj)
 589            elif self.serializable_dict:
 590                return tuple(value for key, value in sorted(obj.items(), key=lambda x: x[0]))
 591            else:
 592                pass
 593        elif DataType.set_ == type_id:
 594            if self.serializable_set:
 595                return obj
 596            elif self.serializable_frozenset:
 597                return set(obj)
 598            elif self.serializable_tuple:
 599                return set(obj)
 600            elif self.serializable_list:
 601                return set(obj)
 602            elif self.serializable_dict:
 603                return set(obj.keys())
 604            else:
 605                pass
 606        elif DataType.frozenset_ == type_id:
 607            if self.serializable_frozenset:
 608                return obj
 609            elif self.serializable_set:
 610                return frozenset(obj)
 611            elif self.serializable_tuple:
 612                return frozenset(obj)
 613            elif self.serializable_list:
 614                return frozenset(obj)
 615            elif self.serializable_dict:
 616                return frozenset(obj.keys())
 617            else:
 618                pass
 619        elif DataType.dict_ == type_id:
 620            if self.serializable_dict:
 621                return obj
 622            elif self.serializable_tuple:
 623                return dict(obj)
 624            elif self.serializable_list:
 625                return dict(obj)
 626            else:
 627                pass
 628        elif DataType.slice_ == type_id:
 629            if self.serializable_slice:
 630                return obj
 631            elif self.serializable_tuple:
 632                return slice(*obj)
 633            elif self.serializable_list:
 634                return slice(*obj)
 635            elif self.serializable_dict:
 636                return slice(obj[0], obj[1], obj[2])
 637            else:
 638                pass
 639        else:
 640            raise RuntimeError('Unknown type_id')
 641        
 642        raise CanNotAdjustFromSerializableError(f'Can not adjust from serializable. Type: {type_id}, obj: {obj}')
 643    
 644    afs = adjust_from_serializable
 645    
 646    # def is_replicatable_object_attribute(self, attribute: Any) -> bool:
 647    #     if is_setable_data_descriptor(attribute):
 648    #         data = attribute.__get__(None, None)
 649    #     elif is_callable(attribute):
 650    #         return False
 651    #     else:
 652    #         return True
 653
 654    def serialize_container(self, type_id: DataType, obj: Any) -> Any:
 655        if DataType.list_ == type_id:
 656            new_obj = list()
 657            for item in obj:
 658                result: ResultExistence[int] = self.serialize_impl(item)
 659                if result:
 660                    new_obj.append(result.value)
 661        elif DataType.tuple_ == type_id:
 662            new_obj = list()
 663            for item in obj:
 664                result: ResultExistence[int] = self.serialize_impl(item)
 665                if result:
 666                    new_obj.append(result.value)
 667            
 668            new_obj = tuple(new_obj)
 669        elif DataType.set_ == type_id:
 670            new_obj = set()
 671            for item in obj:
 672                result: ResultExistence[int] = self.serialize_impl(item)
 673                if result:
 674                    new_obj.add(result.value)
 675        elif DataType.frozenset_ == type_id:
 676            new_obj = set()
 677            for item in obj:
 678                result: ResultExistence[int] = self.serialize_impl(item)
 679                if result:
 680                    new_obj.add(result.value)
 681                
 682            new_obj = frozenset(new_obj)
 683        elif DataType.dict_ == type_id:
 684            new_obj = dict()
 685            for key, value in obj.items():
 686                key_result: ResultExistence[int] = self.serialize_impl(key)
 687                value_result: ResultExistence[int] = self.serialize_impl(value)
 688                if key_result and value_result:
 689                    new_obj[key_result.value] = value_result.value
 690        
 691        return new_obj
 692    
 693    sc = serialize_container
 694
 695    def serialize_impl(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
 696        result_exists: bool = True
 697        id_: int = id(obj)
 698        obj_type = type(obj)
 699        if (int != obj_type) and (id_ in self.objects_ids_by_id):
 700            new_object: bool = False
 701            object_id: int = self.objects_ids_by_id[id_]
 702        else:
 703            # int object must always produce new object_id because first 256 ints are persistent across Python sessions and
 704            # this can cause issues within users of current module. For example within `cengal/hardware/memory/shared_memory`
 705            # which changes int values inline instead of producing new objects.
 706            new_object = True
 707            object_id = self.objects_id_gen()
 708            self.objects_ids[object_id] = id_
 709            self.objects_db[object_id] = obj
 710        
 711        if not new_object:
 712            return ResultExistence[int](result_exists, object_id)
 713
 714        if  self.serializable_any or (obj_type in self.serializable_data_types):
 715            serializable: bool = True
 716            type_id: DataType = data_type_by_type.get(obj_type, DataType.unknown_serializable)
 717        else:
 718            serializable = False
 719            type_id = data_type_by_type.get(obj_type, DataType.class_)
 720        
 721        if obj_type in known_container_types:
 722            known_container: bool = True
 723        else:
 724            known_container = False
 725        
 726        class_info: Dict[int, Any] = None
 727        known_data: bool = None
 728        class_id: int = None
 729        is_new_class: bool = None
 730        class_name: str = None
 731        new_obj_slots: List[Tuple[str, Any]] = None
 732        new_obj_dict: Dict[str, Any] = None
 733        obj_mapping: Dict = None
 734        obj_sequence: List = None
 735        obj_set: Set = None
 736        if serializable:
 737            if known_container:
 738                object_info = (
 739                    self.ats(DataType.int_, object_id),
 740                    self.ats(DataType.int_, type_id.value),
 741                    self.sc(type_id, obj),
 742                )
 743            else:
 744                object_info = (
 745                    self.ats(DataType.int_, object_id),
 746                    self.ats(DataType.int_, type_id.value),
 747                    obj,
 748                )
 749        else:
 750            if obj_type in known_data_types:
 751                known_data = True
 752            else:
 753                known_data = False
 754            
 755            if DataType.class_ == type_id:
 756                new_obj_slots = list()
 757                for slot_name, slot_value in filled_slot_names_with_values_gen(obj):
 758                    # if not hasattr(slot_value, '__set__'):
 759                    #     # if not setable descriptor
 760                    #     continue
 761
 762                    if self.serializable_str:
 763                        adjusted_slot_name = slot_name
 764                    else:
 765                        adjusted_slot_name = self.ats(DataType.str_, slot_name)
 766                    
 767                    item_result: ResultExistence[int] = self.serialize_impl(slot_value)
 768                    if item_result:
 769                        if self.serializable_tuple:
 770                            new_obj_slots.append((adjusted_slot_name, item_result.value))
 771                        elif self.serializable_list:
 772                            new_obj_slots.append([adjusted_slot_name, item_result.value])
 773                        else:
 774                            new_obj_slots.append(self.ats(DataType.tuple_, (adjusted_slot_name, item_result.value)))
 775                
 776                if new_obj_slots:
 777                    if self.serializable_list:
 778                        pass
 779                    elif self.serializable_tuple:
 780                        new_obj_slots = tuple(new_obj_slots)
 781                    else:
 782                        new_obj_slots = self.ats(DataType.list_, new_obj_slots)
 783                
 784                new_obj_dict = dict()
 785                if hasattr(obj, '__dict__'):
 786                    for key, value in obj.__dict__.items():
 787                        # raw_value = getattr_static(obj, key)
 788                        # if hasattr(raw_value, '__get__') and (not hasattr(raw_value, '__set__')):
 789                        #     # if not setable descriptor
 790                        #     continue
 791
 792                        if self.serializable_str:
 793                            adjusted_key = key
 794                        else:
 795                            adjusted_key = self.ats(DataType.str_, key)
 796
 797                        value_result: ResultExistence[int] = self.serialize_impl(value)
 798                        if value_result:
 799                            new_obj_dict[adjusted_key] = value_result.value
 800                        else:
 801                            continue
 802                
 803                    if new_obj_dict:
 804                        if self.serializable_dict:
 805                            pass
 806                        else:
 807                            new_obj_dict = self.ats(DataType.dict_, new_obj_dict)
 808                
 809                obj_mapping = dict()
 810                obj_sequence = list()
 811                obj_set = set()
 812                if isinstance(obj, MutableMapping):
 813                    for key, value in obj.items():
 814                        key_result: ResultExistence[int] = self.serialize_impl(value)
 815                        if not key_result:
 816                            continue
 817
 818                        value_result: ResultExistence[int] = self.serialize_impl(value)
 819                        if value_result:
 820                            obj_mapping[key_result.value] = value_result.value
 821                        else:
 822                            continue
 823                    
 824                    if obj_mapping:
 825                        if self.serializable_dict:
 826                            pass
 827                        else:
 828                            obj_mapping = self.ats(DataType.dict_, obj_mapping)
 829                elif isinstance(obj, MutableSequence):
 830                    for item in obj:
 831                        item_result: ResultExistence[int] = self.serialize_impl(item)
 832                        if item_result:
 833                            obj_sequence.append(item_result.value)
 834                        else:
 835                            continue
 836                    
 837                    if obj_sequence:
 838                        if self.serializable_list:
 839                            pass
 840                        else:
 841                            obj_sequence = self.ats(DataType.list_, obj_sequence)
 842                elif isinstance(obj, MutableSet):
 843                    for item in obj:
 844                        item_result: ResultExistence[int] = self.serialize_impl(item)
 845                        if item_result:
 846                            obj_set.add(item_result.value)
 847                        else:
 848                            continue
 849                    
 850                    if obj_set:
 851                        if self.serializable_set:
 852                            pass
 853                        else:
 854                            obj_set = self.ats(DataType.set_, obj_set)
 855                else:
 856                    pass
 857
 858                if ignore_empty_classes:
 859                    result_exists = new_obj_slots or new_obj_dict or obj_mapping or obj_sequence or obj_set
 860                
 861                if obj_type in self.known_classes:
 862                    is_new_class = False
 863                    class_id = self.known_classes[obj_type]
 864                else:
 865                    class_info = dict()
 866                    is_new_class = True
 867                    class_name = obj_type.__name__
 868                    class_id = self.classes_id_gen()
 869                    self.known_classes[obj_type] = class_id
 870                    self.known_classes_by_id[class_id] = obj_type
 871                    module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(obj)
 872                    adjusted_owning_names_path: List[str] = [self.ats(DataType.str_, name) for name in owning_names_path]
 873                    module_importable_str_and_owning_names_path = (class_name, module_importable_str, tuple(owning_names_path))
 874                    self.known_classes_info[module_importable_str_and_owning_names_path] = class_id
 875                    self.known_classes_info_by_id[class_id] = module_importable_str_and_owning_names_path
 876
 877                    if result_exists:
 878                        class_info = (
 879                            self.ats(DataType.int_, class_id),
 880                            self.ats(DataType.str_, class_name),
 881                            self.ats(DataType.str_, module_importable_str),
 882                            self.ats(DataType.list_, adjusted_owning_names_path),
 883                        )
 884
 885                        if self.serializable_tuple:
 886                            adjusted_class_info = class_info
 887                        else:
 888                            adjusted_class_info = self.ats(DataType.tuple_, class_info)
 889                        
 890                        if self.on_new_class_handler:
 891                            self.on_new_class_handler(
 892                                adjusted_class_info,
 893                                obj_type,
 894                                class_id,
 895                                class_name,
 896                                module_importable_str,
 897                                owning_names_path,
 898                                module_importable_str_and_owning_names_path
 899                            )
 900
 901                # will be later serialized much faster than without `if else None`
 902                object_info = (
 903                    self.ats(DataType.int_, object_id),
 904                    self.ats(DataType.int_, type_id.value),
 905                    self.ats(DataType.none_, None),
 906                    self.ats(DataType.int_, class_id),
 907                    new_obj_slots if new_obj_slots else self.ats(DataType.list_, list()),
 908                    new_obj_dict if new_obj_dict else self.ats(DataType.dict_, dict()),
 909                    obj_mapping if obj_mapping else self.ats(DataType.dict_, dict()),
 910                    obj_sequence if obj_sequence else self.ats(DataType.list_, list()),
 911                    obj_set if obj_set else self.ats(DataType.set_, set()),
 912                )
 913            elif known_data:
 914                object_info = (
 915                    self.ats(DataType.int_, object_id),
 916                    self.ats(DataType.int_, type_id.value),
 917                    self.ats(type_id, obj),
 918                )
 919            elif known_container:
 920                object_info = (
 921                    self.ats(DataType.int_, object_id),
 922                    self.ats(DataType.int_, type_id.value),
 923                    self.ats(type_id, self.sc(type_id, obj)),
 924                )
 925            else:
 926                raise RuntimeError('Unknown type_id')
 927
 928        if self.serializable_tuple:
 929            adjusted_object_info = object_info
 930        else:
 931            adjusted_object_info = self.ats(DataType.tuple_, object_info)
 932        
 933        if result_exists:
 934            if self.on_new_obj_info_handler:
 935                self.on_new_obj_info_handler(
 936                    adjusted_object_info,
 937                    obj,
 938                    object_id,
 939                    type_id,
 940                    serializable,
 941                    known_container,
 942                    known_data,
 943                    class_id,
 944                    is_new_class,
 945                    new_obj_slots,
 946                    new_obj_dict,
 947                    obj_mapping,
 948                    obj_sequence,
 949                    obj_set,
 950                )
 951        
 952        return ResultExistence[int](result_exists, object_id)
 953    
 954    si = serialize_impl
 955
 956    def serialize(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
 957        with DisableGC():
 958            return self.serialize_impl(obj, ignore_empty_classes)
 959    
 960    s = serialize
 961    
 962    def deserialize_class_impl(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
 963        if self.serializable_tuple:
 964            pass
 965        else:
 966            class_info = self.afs(DataType.tuple_, class_info)
 967
 968        class_id: int = self.afs(DataType.int_, class_info[ClassInfoFields.class_id.value])
 969        if class_id in self.known_classes_by_id:
 970            return ResultExistence[Tuple[int, Type]](True, (class_id, self.known_classes_by_id[class_id]))
 971        else:
 972            class_name: str = self.afs(DataType.str_, class_info[ClassInfoFields.class_name.value])
 973            module_importable_str: str = self.afs(DataType.str_, class_info[ClassInfoFields.module_importable_str.value])
 974            owning_names_path: List[str] = self.afs(DataType.list_, class_info[ClassInfoFields.owning_names_path.value])
 975            adjusted_owning_names_path: List[str] = [self.afs(DataType.str_, name) for name in owning_names_path]
 976            obj_class: Type = entity_by_name_module_importable_str_and_owning_names_path(class_name, module_importable_str, adjusted_owning_names_path)
 977            self.known_classes_by_id[class_id] = obj_class
 978            self.known_classes[obj_class] = class_id
 979            class_info_tuple: Tuple = (class_name, module_importable_str, tuple(owning_names_path)) 
 980            self.known_classes_info[class_info_tuple] = class_id
 981            self.known_classes_info_by_id[class_id] = class_info_tuple
 982            return ResultExistence[Tuple[int, Type]](True, (class_id, obj_class))
 983    
 984    dcli = deserialize_class_impl
 985    
 986    def deserialize_class(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
 987        with DisableGC():
 988            return self.deserialize_class_impl(class_info)
 989    
 990    dcl = deserialize_class
 991
 992    def deserialize_container_impl(self, type_id: DataType, obj: Any) -> Any:
 993        new_obj = obj
 994        if DataType.list_ == type_id:
 995            new_obj = list()
 996            for item_id in obj:
 997                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
 998        elif DataType.tuple_ == type_id:
 999            new_obj = list()
1000            for item_id in obj:
1001                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
1002            
1003            new_obj = tuple(new_obj)
1004        elif DataType.set_ == type_id:
1005            new_obj = set()
1006            for item_id in obj:
1007                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1008        elif DataType.frozenset_ == type_id:
1009            new_obj = set()
1010            for item_id in obj:
1011                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1012                
1013            new_obj = frozenset(new_obj)
1014        elif DataType.dict_ == type_id:
1015            new_obj = dict()
1016            for key_id, value_id in obj.items():
1017                new_obj[self.objects_db[int(self.afs(DataType.int_, key_id))]] = self.objects_db[self.afs(DataType.int_, value_id)]
1018        
1019        return new_obj
1020    
1021    dcoi = deserialize_container_impl
1022
1023    def deserialize_container(self, type_id: DataType, obj: Any) -> Any:
1024        with DisableGC():
1025            return self.deserialize_container_impl(type_id, obj)
1026    
1027    dco = deserialize_container
1028
1029    def deserialize_obj_impl(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1030        if self.serializable_tuple:
1031            pass
1032        else:
1033            obj_info = self.afs(DataType.tuple_, obj_info)
1034        
1035        object_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.object_id.value])
1036        if object_id in self.objects_db:
1037            return ResultExistence[Tuple[int, Any]](True, (object_id, self.objects_db[object_id]))
1038        
1039        type_id: DataType = DataType(self.afs(DataType.int_, obj_info[ObjectInfoFields.type_id.value]))
1040        
1041        obj_type = data_type[type_id] 
1042        serializable: bool = self.serializable_any or (obj_type in self.serializable_data_types)
1043        known_container: bool = obj_type in known_container_types
1044        known_data: bool = None
1045        
1046        if serializable:
1047            if known_container:
1048                obj = self.dcoi(type_id, obj_info[ObjectInfoFields.object_.value])
1049            else:
1050                obj = obj_info[ObjectInfoFields.object_.value]
1051        else:
1052            known_data = obj_type in known_data_types
1053            
1054            if DataType.class_ == type_id:
1055                class_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.class_id.value])
1056                obj_class: Type = self.known_classes_by_id[class_id]
1057                obj: Any = obj_class.__new__(obj_class)
1058
1059                if obj_info[ObjectInfoFields.clonable_slots.value]:
1060                    clonable_slots = self.afs(DataType.list_, obj_info[ObjectInfoFields.clonable_slots.value])
1061                    for slot_name, slot_id in clonable_slots:
1062                        slot_name = self.afs(DataType.str_, slot_name)
1063                        slot_id = self.afs(DataType.int_, slot_id)
1064                        child_obj = self.objects_db[slot_id]
1065                        setattr(obj, slot_name, child_obj)
1066                
1067                if obj_info[ObjectInfoFields.clonable_dict_items.value]:
1068                    clonable_dict_items = self.afs(DataType.dict_, obj_info[ObjectInfoFields.clonable_dict_items.value])
1069                    for key, value_id in clonable_dict_items.items():
1070                        key = self.afs(DataType.str_, key)
1071                        value_id = self.afs(DataType.int_, value_id)
1072                        child_obj = self.objects_db[value_id]
1073                        setattr(obj, key, child_obj)
1074                
1075                if obj_info[ObjectInfoFields.contained_mapping.value]:
1076                    contained_mapping = self.afs(DataType.dict_, obj_info[ObjectInfoFields.contained_mapping.value])
1077                    for key_id, value_id in contained_mapping.items():
1078                        key_id = self.afs(DataType.int_, key_id)
1079                        value_id = self.afs(DataType.int_, value_id)
1080                        child_key = self.objects_db[int(key_id)]
1081                        child_value = self.objects_db[value_id]
1082                        obj[child_key] = child_value
1083                
1084                if obj_info[ObjectInfoFields.contained_sequence.value]:
1085                    contained_sequence = self.afs(DataType.list_, obj_info[ObjectInfoFields.contained_sequence.value])
1086                    for item_id in contained_sequence:
1087                        item_id = self.afs(DataType.int_, item_id)
1088                        child_item = self.objects_db[item_id]
1089                        obj.append(child_item)
1090                
1091                if obj_info[ObjectInfoFields.contained_set.value]:
1092                    contained_set = self.afs(DataType.set_, obj_info[ObjectInfoFields.contained_set.value])
1093                    for item_id in contained_set:
1094                        item_id = self.afs(DataType.int_, item_id)
1095                        child_item = self.objects_db[item_id]
1096                        obj.add(child_item)
1097            elif known_data:
1098                obj = self.afs(type_id, obj_info[ObjectInfoFields.object_.value])
1099            elif known_container:
1100                obj = self.dcoi(type_id, self.afs(type_id, obj_info[ObjectInfoFields.object_.value]))
1101            else:
1102                raise RuntimeError('Unknown type_id')
1103        
1104        self.objects_db[object_id] = obj
1105        id_: int = id(obj)
1106        self.objects_ids[object_id] = id_
1107        self.objects_ids_by_id[id_] = object_id
1108        return ResultExistence[Tuple[int, Any]](True, (object_id, obj))
1109    
1110    doi = deserialize_obj_impl
1111
1112    def deserialize_obj(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1113        with DisableGC():
1114            return self.deserialize_obj_impl(obj_info)
1115    
1116    do = deserialize_obj
RemoteObjectsManager( on_new_class_handler: Union[Callable, NoneType] = None, on_new_obj_info_handler: Union[Callable, NoneType] = None, objects_db: Union[Dict[int, Any], NoneType] = None, classes_id_gen: Union[Callable, NoneType] = None, objects_id_gen: Union[Callable, NoneType] = None, serializable_data_types: Union[Set[Type], NoneType] = None)
179    def __init__(self, 
180                 on_new_class_handler: Optional[Callable] = None,
181                 on_new_obj_info_handler: Optional[Callable] = None,
182                 # classess_db: Optional[Dict[int, Type]] = None, 
183                 objects_db: Optional[Dict[int, Any]] = None, 
184                 classes_id_gen: Optional[Callable] = None,
185                 objects_id_gen: Optional[Callable] = None,
186                 serializable_data_types: Optional[Set[Type]] = None,
187                 ) -> None:
188        # self.classess_db: Dict[int, Type] = dict() if classess_db is None else classess_db
189        self.classes_id_gen: IDGenerator = IDGenerator() if classes_id_gen is None else classes_id_gen
190        self.objects_db: Dict[int, Any] = dict() if objects_db is None else objects_db
191        self.objects_id_gen: IDGenerator = IDGenerator() if objects_id_gen is None else objects_id_gen
192        self.serializable_data_types: Set[Type] = default_serializable_data_types if serializable_data_types is None else serializable_data_types
193        self.serializable_any: bool = not self.serializable_data_types
194        self.serializable_int: bool = (int in self.serializable_data_types) or self.serializable_any
195        self.serializable_float: bool = (float in self.serializable_data_types) or self.serializable_any
196        self.serializable_complex: bool = (complex in self.serializable_data_types) or self.serializable_any
197        self.serializable_str: bool = (str in self.serializable_data_types) or self.serializable_any
198        self.serializable_bytes: bool = (bytes in self.serializable_data_types) or self.serializable_any
199        self.serializable_bytearray: bool = (bytearray in self.serializable_data_types) or self.serializable_any
200        self.serializable_bool: bool = (bool in self.serializable_data_types) or self.serializable_any
201        self.serializable_none: bool = (type(None) in self.serializable_data_types) or self.serializable_any
202        self.serializable_list: bool = (list in self.serializable_data_types) or self.serializable_any
203        self.serializable_tuple: bool = (tuple in self.serializable_data_types) or self.serializable_any
204        self.serializable_set: bool = (set in self.serializable_data_types) or self.serializable_any
205        self.serializable_frozenset: bool = (frozenset in self.serializable_data_types) or self.serializable_any
206        self.serializable_dict: bool = (dict in self.serializable_data_types) or self.serializable_any
207        self.serializable_slice: bool = (slice in self.serializable_data_types) or self.serializable_any
208        self.known_classes: Dict[Type, int] = dict()
209        self.known_classes_by_id: Dict[int, Type] = dict()
210        self.known_classes_info: Dict[Tuple, int] = dict()
211        self.known_classes_info_by_id: Dict[int, Tuple] = dict()
212        self.on_new_class_handler: Optional[Callable] = on_new_class_handler
213        self.on_new_obj_info_handler: Optional[Callable] = on_new_obj_info_handler
214        self.objects_ids: Dict[int, int] = dict()  # (Key: object_id, Value: id(obj))
215        self.objects_ids_by_id: Dict[int, int] = dict()  # (Key: id(obj), Value: object_id)
classes_id_gen: <cyfunction IDGenerator at 0x7f5316b55ad0>
objects_db: Dict[int, Any]
objects_id_gen: <cyfunction IDGenerator at 0x7f5316b55ad0>
serializable_data_types: Set[Type]
serializable_any: bool
serializable_int: bool
serializable_float: bool
serializable_complex: bool
serializable_str: bool
serializable_bytes: bool
serializable_bytearray: bool
serializable_bool: bool
serializable_none: bool
serializable_list: bool
serializable_tuple: bool
serializable_set: bool
serializable_frozenset: bool
serializable_dict: bool
serializable_slice: bool
known_classes: Dict[Type, int]
known_classes_by_id: Dict[int, Type]
known_classes_info: Dict[Tuple, int]
known_classes_info_by_id: Dict[int, Tuple]
on_new_class_handler: Union[Callable, NoneType]
on_new_obj_info_handler: Union[Callable, NoneType]
objects_ids: Dict[int, int]
objects_ids_by_id: Dict[int, int]
def del_object_by_id(self, id_: int) -> None:
217    def del_object_by_id(self, id_: int) -> None:
218        if id_ in self.objects_ids_by_id:
219            object_id = self.objects_ids_by_id[id_]
220            self.objects_ids_by_id.pop(id_, None)
221            self.objects_ids.pop(object_id, None)
222            self.objects_db.pop(object_id, None)
def dobi(self, id_: int) -> None:
217    def del_object_by_id(self, id_: int) -> None:
218        if id_ in self.objects_ids_by_id:
219            object_id = self.objects_ids_by_id[id_]
220            self.objects_ids_by_id.pop(id_, None)
221            self.objects_ids.pop(object_id, None)
222            self.objects_db.pop(object_id, None)
def del_object_by_object_id(self, object_id: int) -> None:
226    def del_object_by_object_id(self, object_id: int) -> None:
227        if object_id in self.objects_ids:
228            id_ = self.objects_ids[object_id]
229            self.objects_ids_by_id.pop(id_, None)
230            self.objects_ids.pop(object_id, None)
231            self.objects_db.pop(object_id, None)
def doboi(self, object_id: int) -> None:
226    def del_object_by_object_id(self, object_id: int) -> None:
227        if object_id in self.objects_ids:
228            id_ = self.objects_ids[object_id]
229            self.objects_ids_by_id.pop(id_, None)
230            self.objects_ids.pop(object_id, None)
231            self.objects_db.pop(object_id, None)
def adjust_to_serializable( self, type_id: DataType, obj: Any) -> Any:
235    def adjust_to_serializable(self, type_id: DataType, obj: Any) -> Any:
236        if DataType.int_ == type_id:
237            if self.serializable_int:
238                return obj
239            elif self.serializable_bytes:
240                return obj.to_bytes(8, 'little')
241            elif self.serializable_bytearray:
242                return bytearray(obj.to_bytes(8, 'little'))
243            elif self.serializable_str:
244                return str(obj)
245            else:
246                pass
247        elif DataType.float_ == type_id:
248            if self.serializable_float:
249                return obj
250            elif self.serializable_bytes:
251                return pack('=d', obj)
252            elif self.serializable_bytearray:
253                return bytearray(pack('=d', obj))
254            elif self.serializable_str:
255                return str(obj)
256            else:
257                pass
258        elif DataType.complex_ == type_id:
259            if self.serializable_complex:
260                return obj
261            elif self.serializable_bytes:
262                return pack('=dd', obj.real, obj.imag)
263            elif self.serializable_bytearray:
264                return bytearray(pack('=dd', obj.real, obj.imag))
265            elif self.serializable_str:
266                return str(obj)
267            elif self.serializable_float:
268                if self.serializable_tuple:
269                    return (obj.real, obj.imag)
270                elif self.serializable_list:
271                    return [obj.real, obj.imag]
272                else:
273                    pass
274            else:
275                pass
276        elif DataType.str_ == type_id:
277            if self.serializable_str:
278                return obj
279            elif self.serializable_bytes:
280                return obj.encode('utf-8')
281            elif self.serializable_bytearray:
282                return bytearray(obj.encode('utf-8'))
283            elif self.serializable_int:
284                if self.serializable_tuple:
285                    return tuple(ord(c) for c in obj)
286                elif self.serializable_list:
287                    return [ord(c) for c in obj]
288                else:
289                    pass
290            elif self.serializable_float:
291                if self.serializable_tuple:
292                    return tuple(float(ord(c)) for c in obj)
293                elif self.serializable_list:
294                    return [float(ord(c)) for c in obj]
295                else:
296                    pass
297            else:
298                pass
299        elif DataType.bytes_ == type_id:
300            if self.serializable_bytes:
301                return obj
302            elif self.serializable_bytearray:
303                return bytearray(obj)
304            elif self.serializable_str:
305                return obj.hex()
306            elif self.serializable_tuple:
307                if self.serializable_int:
308                    return  tuple(int(c) for c in obj)
309                if self.serializable_float:
310                    return  tuple(float(int(c)) for c in obj)
311                else:
312                    pass
313            elif self.serializable_list:
314                if self.serializable_int:
315                    return  [int(c) for c in obj]
316                if self.serializable_float:
317                    return  [float(int(c)) for c in obj]
318                else:
319                    pass
320            else:
321                pass
322        elif DataType.bytearray_ == type_id:
323            if self.serializable_bytearray:
324                return obj
325            elif self.serializable_bytes:
326                return bytes(obj)
327            elif self.serializable_str:
328                return obj.hex()
329            elif self.serializable_tuple:
330                if self.serializable_int:
331                    return  tuple(int(c) for c in obj)
332                if self.serializable_float:
333                    return  tuple(float(int(c)) for c in obj)
334                else:
335                    pass
336            elif self.serializable_list:
337                if self.serializable_int:
338                    return  [int(c) for c in obj]
339                if self.serializable_float:
340                    return  [float(int(c)) for c in obj]
341                else:
342                    pass
343            else:
344                pass
345        elif DataType.bool_ == type_id:
346            if self.serializable_bool:
347                return obj
348            elif self.serializable_int:
349                return int(obj)
350            elif self.serializable_bytes:
351                return obj.to_bytes(1, 'little')
352            elif self.serializable_bytearray:
353                return bytearray(obj.to_bytes(1, 'little'))
354            elif self.serializable_str:
355                return str(obj)
356            elif self.serializable_float:
357                return float(int(obj))
358            else:
359                pass
360        elif DataType.none_ == type_id:
361            if self.serializable_none:
362                return obj
363            elif self.serializable_bool:
364                return False
365            elif self.serializable_int:
366                return 0
367            elif self.serializable_bytes:
368                return b'\x00'
369            elif self.serializable_bytearray:
370                return bytearray(b'\x00')
371            elif self.serializable_str:
372                return ''
373            elif self.serializable_float:
374                return 0.0
375            else:
376                pass
377        elif DataType.list_ == type_id:
378            if self.serializable_list:
379                return obj
380            elif self.serializable_tuple:
381                return tuple(obj)
382            elif self.serializable_dict:
383                return dict({index: item for index, item in enumerate(obj)})
384            else:
385                pass
386        elif DataType.tuple_ == type_id:
387            if self.serializable_tuple:
388                return obj
389            elif self.serializable_list:
390                return list(obj)
391            elif self.serializable_dict:
392                return dict({index: item for index, item in enumerate(obj)})
393            else:
394                pass
395        elif DataType.set_ == type_id:
396            if self.serializable_set:
397                return obj
398            elif self.serializable_frozenset:
399                return frozenset(obj)
400            elif self.serializable_tuple:
401                return tuple(obj)
402            elif self.serializable_list:
403                return list(obj)
404            elif self.serializable_dict:
405                return dict({k: None for k in obj})
406            else:
407                pass
408        elif DataType.frozenset_ == type_id:
409            if self.serializable_frozenset:
410                return obj
411            elif self.serializable_set:
412                return set(obj)
413            elif self.serializable_tuple:
414                return tuple(obj)
415            elif self.serializable_list:
416                return list(obj)
417            elif self.serializable_dict:
418                return dict({k: None for k in obj})
419            else:
420                pass
421        elif DataType.dict_ == type_id:
422            if self.serializable_dict:
423                return obj
424            elif self.serializable_tuple:
425                return tuple(obj.items())
426            elif self.serializable_list:
427                return list(list(pair) for pair in obj.items())
428            else:
429                pass
430        elif DataType.slice_ == type_id:
431            if self.serializable_slice:
432                return obj
433            elif self.serializable_tuple:
434                return (obj.start, obj.stop, obj.step)
435            elif self.serializable_list:
436                return [obj.start, obj.stop, obj.step]
437            elif self.serializable_dict:
438                return {0: obj.start, 1: obj.stop, 2: obj.step}
439            else:
440                pass
441        else:
442            raise RuntimeError('Unknown type_id')
443        
444        raise CanNotAdjustToSerializableError(f'Can not adjust to serializable. Type: {type_id}, obj: {obj}')
def ats( self, type_id: DataType, obj: Any) -> Any:
235    def adjust_to_serializable(self, type_id: DataType, obj: Any) -> Any:
236        if DataType.int_ == type_id:
237            if self.serializable_int:
238                return obj
239            elif self.serializable_bytes:
240                return obj.to_bytes(8, 'little')
241            elif self.serializable_bytearray:
242                return bytearray(obj.to_bytes(8, 'little'))
243            elif self.serializable_str:
244                return str(obj)
245            else:
246                pass
247        elif DataType.float_ == type_id:
248            if self.serializable_float:
249                return obj
250            elif self.serializable_bytes:
251                return pack('=d', obj)
252            elif self.serializable_bytearray:
253                return bytearray(pack('=d', obj))
254            elif self.serializable_str:
255                return str(obj)
256            else:
257                pass
258        elif DataType.complex_ == type_id:
259            if self.serializable_complex:
260                return obj
261            elif self.serializable_bytes:
262                return pack('=dd', obj.real, obj.imag)
263            elif self.serializable_bytearray:
264                return bytearray(pack('=dd', obj.real, obj.imag))
265            elif self.serializable_str:
266                return str(obj)
267            elif self.serializable_float:
268                if self.serializable_tuple:
269                    return (obj.real, obj.imag)
270                elif self.serializable_list:
271                    return [obj.real, obj.imag]
272                else:
273                    pass
274            else:
275                pass
276        elif DataType.str_ == type_id:
277            if self.serializable_str:
278                return obj
279            elif self.serializable_bytes:
280                return obj.encode('utf-8')
281            elif self.serializable_bytearray:
282                return bytearray(obj.encode('utf-8'))
283            elif self.serializable_int:
284                if self.serializable_tuple:
285                    return tuple(ord(c) for c in obj)
286                elif self.serializable_list:
287                    return [ord(c) for c in obj]
288                else:
289                    pass
290            elif self.serializable_float:
291                if self.serializable_tuple:
292                    return tuple(float(ord(c)) for c in obj)
293                elif self.serializable_list:
294                    return [float(ord(c)) for c in obj]
295                else:
296                    pass
297            else:
298                pass
299        elif DataType.bytes_ == type_id:
300            if self.serializable_bytes:
301                return obj
302            elif self.serializable_bytearray:
303                return bytearray(obj)
304            elif self.serializable_str:
305                return obj.hex()
306            elif self.serializable_tuple:
307                if self.serializable_int:
308                    return  tuple(int(c) for c in obj)
309                if self.serializable_float:
310                    return  tuple(float(int(c)) for c in obj)
311                else:
312                    pass
313            elif self.serializable_list:
314                if self.serializable_int:
315                    return  [int(c) for c in obj]
316                if self.serializable_float:
317                    return  [float(int(c)) for c in obj]
318                else:
319                    pass
320            else:
321                pass
322        elif DataType.bytearray_ == type_id:
323            if self.serializable_bytearray:
324                return obj
325            elif self.serializable_bytes:
326                return bytes(obj)
327            elif self.serializable_str:
328                return obj.hex()
329            elif self.serializable_tuple:
330                if self.serializable_int:
331                    return  tuple(int(c) for c in obj)
332                if self.serializable_float:
333                    return  tuple(float(int(c)) for c in obj)
334                else:
335                    pass
336            elif self.serializable_list:
337                if self.serializable_int:
338                    return  [int(c) for c in obj]
339                if self.serializable_float:
340                    return  [float(int(c)) for c in obj]
341                else:
342                    pass
343            else:
344                pass
345        elif DataType.bool_ == type_id:
346            if self.serializable_bool:
347                return obj
348            elif self.serializable_int:
349                return int(obj)
350            elif self.serializable_bytes:
351                return obj.to_bytes(1, 'little')
352            elif self.serializable_bytearray:
353                return bytearray(obj.to_bytes(1, 'little'))
354            elif self.serializable_str:
355                return str(obj)
356            elif self.serializable_float:
357                return float(int(obj))
358            else:
359                pass
360        elif DataType.none_ == type_id:
361            if self.serializable_none:
362                return obj
363            elif self.serializable_bool:
364                return False
365            elif self.serializable_int:
366                return 0
367            elif self.serializable_bytes:
368                return b'\x00'
369            elif self.serializable_bytearray:
370                return bytearray(b'\x00')
371            elif self.serializable_str:
372                return ''
373            elif self.serializable_float:
374                return 0.0
375            else:
376                pass
377        elif DataType.list_ == type_id:
378            if self.serializable_list:
379                return obj
380            elif self.serializable_tuple:
381                return tuple(obj)
382            elif self.serializable_dict:
383                return dict({index: item for index, item in enumerate(obj)})
384            else:
385                pass
386        elif DataType.tuple_ == type_id:
387            if self.serializable_tuple:
388                return obj
389            elif self.serializable_list:
390                return list(obj)
391            elif self.serializable_dict:
392                return dict({index: item for index, item in enumerate(obj)})
393            else:
394                pass
395        elif DataType.set_ == type_id:
396            if self.serializable_set:
397                return obj
398            elif self.serializable_frozenset:
399                return frozenset(obj)
400            elif self.serializable_tuple:
401                return tuple(obj)
402            elif self.serializable_list:
403                return list(obj)
404            elif self.serializable_dict:
405                return dict({k: None for k in obj})
406            else:
407                pass
408        elif DataType.frozenset_ == type_id:
409            if self.serializable_frozenset:
410                return obj
411            elif self.serializable_set:
412                return set(obj)
413            elif self.serializable_tuple:
414                return tuple(obj)
415            elif self.serializable_list:
416                return list(obj)
417            elif self.serializable_dict:
418                return dict({k: None for k in obj})
419            else:
420                pass
421        elif DataType.dict_ == type_id:
422            if self.serializable_dict:
423                return obj
424            elif self.serializable_tuple:
425                return tuple(obj.items())
426            elif self.serializable_list:
427                return list(list(pair) for pair in obj.items())
428            else:
429                pass
430        elif DataType.slice_ == type_id:
431            if self.serializable_slice:
432                return obj
433            elif self.serializable_tuple:
434                return (obj.start, obj.stop, obj.step)
435            elif self.serializable_list:
436                return [obj.start, obj.stop, obj.step]
437            elif self.serializable_dict:
438                return {0: obj.start, 1: obj.stop, 2: obj.step}
439            else:
440                pass
441        else:
442            raise RuntimeError('Unknown type_id')
443        
444        raise CanNotAdjustToSerializableError(f'Can not adjust to serializable. Type: {type_id}, obj: {obj}')
def adjust_from_serializable( self, type_id: DataType, obj: Any) -> Any:
448    def adjust_from_serializable(self, type_id: DataType, obj: Any) -> Any:
449        if DataType.int_ == type_id:
450            if self.serializable_int:
451                return obj
452            elif self.serializable_bytes:
453                return int.from_bytes(obj, 'little')
454            elif self.serializable_bytearray:
455                return int.from_bytes(bytes(obj), 'little')
456            elif self.serializable_str:
457                return int(obj)
458            else:
459                pass
460        elif DataType.float_ == type_id:
461            if self.serializable_float:
462                return obj
463            elif self.serializable_bytes:
464                return unpack('=d', obj)[0]
465            elif self.serializable_bytearray:
466                return unpack('=d', bytes(obj))[0]
467            elif self.serializable_str:
468                return float(obj)
469            else:
470                pass
471        elif DataType.complex_ == type_id:
472            if self.serializable_complex:
473                return obj
474            elif self.serializable_bytes:
475                return complex(*unpack('=dd', obj))
476            elif self.serializable_bytearray:
477                return complex(*unpack('=dd', bytes(obj)))
478            elif self.serializable_str:
479                return complex(*obj)
480            elif self.serializable_float:
481                if self.serializable_tuple:
482                    return complex(*obj)
483                elif self.serializable_list:
484                    return complex(*obj)
485                else:
486                    pass
487            else:
488                pass
489        elif DataType.str_ == type_id:
490            if self.serializable_str:
491                return obj
492            elif self.serializable_bytes:
493                return obj.decode('utf-8')
494            elif self.serializable_bytearray:
495                return bytes(obj).decode('utf-8')
496            elif self.serializable_int:
497                if self.serializable_tuple:
498                    return ''.join(chr(c) for c in obj)
499                elif self.serializable_list:
500                    return ''.join(chr(c) for c in obj)
501                else:
502                    pass
503            elif self.serializable_float:
504                if self.serializable_tuple:
505                    return ''.join(chr(int(round(c))) for c in obj)
506                elif self.serializable_list:
507                    return ''.join(chr(int(round(c))) for c in obj)
508                else:
509                    pass
510            else:
511                pass
512        elif DataType.bytes_ == type_id:
513            if self.serializable_bytes:
514                return obj
515            elif self.serializable_bytearray:
516                return bytes(obj)
517            elif self.serializable_str:
518                return bytes.fromhex(obj)
519            elif self.serializable_tuple:
520                if self.serializable_int:
521                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
522                if self.serializable_float:
523                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
524                else:
525                    pass
526            elif self.serializable_list:
527                if self.serializable_int:
528                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
529                if self.serializable_float:
530                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
531                else:
532                    pass
533            else:
534                pass
535        elif DataType.bytearray_ == type_id:
536            if self.serializable_bytearray:
537                return obj
538            elif self.serializable_bytes:
539                return bytearray(obj)
540            elif self.serializable_str:
541                return bytearray(bytes.fromhex(obj))
542            elif self.serializable_tuple:
543                if self.serializable_int:
544                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
545                if self.serializable_float:
546                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
547                else:
548                    pass
549            elif self.serializable_list:
550                if self.serializable_int:
551                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
552                if self.serializable_float:
553                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
554                else:
555                    pass
556            else:
557                pass
558        elif DataType.bool_ == type_id:
559            if self.serializable_bool:
560                return obj
561            elif self.serializable_int:
562                return bool(obj)
563            elif self.serializable_bytes:
564                return bool(int.from_bytes(obj, 'little'))
565            elif self.serializable_bytearray:
566                return bool(int.from_bytes(bytes(obj), 'little'))
567            elif self.serializable_str:
568                return bool(obj)
569            elif self.serializable_float:
570                return bool(int(round(obj)))
571            else:
572                pass
573        elif DataType.none_ == type_id:
574            return None
575        elif DataType.list_ == type_id:
576            if self.serializable_list:
577                return obj
578            elif self.serializable_tuple:
579                return list(obj)
580            elif self.serializable_dict:
581                return [value for key, value in sorted(obj.items(), key=lambda x: x[0])]
582            else:
583                pass
584        elif DataType.tuple_ == type_id:
585            if self.serializable_tuple:
586                return obj
587            elif self.serializable_list:
588                return tuple(obj)
589            elif self.serializable_dict:
590                return tuple(value for key, value in sorted(obj.items(), key=lambda x: x[0]))
591            else:
592                pass
593        elif DataType.set_ == type_id:
594            if self.serializable_set:
595                return obj
596            elif self.serializable_frozenset:
597                return set(obj)
598            elif self.serializable_tuple:
599                return set(obj)
600            elif self.serializable_list:
601                return set(obj)
602            elif self.serializable_dict:
603                return set(obj.keys())
604            else:
605                pass
606        elif DataType.frozenset_ == type_id:
607            if self.serializable_frozenset:
608                return obj
609            elif self.serializable_set:
610                return frozenset(obj)
611            elif self.serializable_tuple:
612                return frozenset(obj)
613            elif self.serializable_list:
614                return frozenset(obj)
615            elif self.serializable_dict:
616                return frozenset(obj.keys())
617            else:
618                pass
619        elif DataType.dict_ == type_id:
620            if self.serializable_dict:
621                return obj
622            elif self.serializable_tuple:
623                return dict(obj)
624            elif self.serializable_list:
625                return dict(obj)
626            else:
627                pass
628        elif DataType.slice_ == type_id:
629            if self.serializable_slice:
630                return obj
631            elif self.serializable_tuple:
632                return slice(*obj)
633            elif self.serializable_list:
634                return slice(*obj)
635            elif self.serializable_dict:
636                return slice(obj[0], obj[1], obj[2])
637            else:
638                pass
639        else:
640            raise RuntimeError('Unknown type_id')
641        
642        raise CanNotAdjustFromSerializableError(f'Can not adjust from serializable. Type: {type_id}, obj: {obj}')
def afs( self, type_id: DataType, obj: Any) -> Any:
448    def adjust_from_serializable(self, type_id: DataType, obj: Any) -> Any:
449        if DataType.int_ == type_id:
450            if self.serializable_int:
451                return obj
452            elif self.serializable_bytes:
453                return int.from_bytes(obj, 'little')
454            elif self.serializable_bytearray:
455                return int.from_bytes(bytes(obj), 'little')
456            elif self.serializable_str:
457                return int(obj)
458            else:
459                pass
460        elif DataType.float_ == type_id:
461            if self.serializable_float:
462                return obj
463            elif self.serializable_bytes:
464                return unpack('=d', obj)[0]
465            elif self.serializable_bytearray:
466                return unpack('=d', bytes(obj))[0]
467            elif self.serializable_str:
468                return float(obj)
469            else:
470                pass
471        elif DataType.complex_ == type_id:
472            if self.serializable_complex:
473                return obj
474            elif self.serializable_bytes:
475                return complex(*unpack('=dd', obj))
476            elif self.serializable_bytearray:
477                return complex(*unpack('=dd', bytes(obj)))
478            elif self.serializable_str:
479                return complex(*obj)
480            elif self.serializable_float:
481                if self.serializable_tuple:
482                    return complex(*obj)
483                elif self.serializable_list:
484                    return complex(*obj)
485                else:
486                    pass
487            else:
488                pass
489        elif DataType.str_ == type_id:
490            if self.serializable_str:
491                return obj
492            elif self.serializable_bytes:
493                return obj.decode('utf-8')
494            elif self.serializable_bytearray:
495                return bytes(obj).decode('utf-8')
496            elif self.serializable_int:
497                if self.serializable_tuple:
498                    return ''.join(chr(c) for c in obj)
499                elif self.serializable_list:
500                    return ''.join(chr(c) for c in obj)
501                else:
502                    pass
503            elif self.serializable_float:
504                if self.serializable_tuple:
505                    return ''.join(chr(int(round(c))) for c in obj)
506                elif self.serializable_list:
507                    return ''.join(chr(int(round(c))) for c in obj)
508                else:
509                    pass
510            else:
511                pass
512        elif DataType.bytes_ == type_id:
513            if self.serializable_bytes:
514                return obj
515            elif self.serializable_bytearray:
516                return bytes(obj)
517            elif self.serializable_str:
518                return bytes.fromhex(obj)
519            elif self.serializable_tuple:
520                if self.serializable_int:
521                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
522                if self.serializable_float:
523                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
524                else:
525                    pass
526            elif self.serializable_list:
527                if self.serializable_int:
528                    return  b''.join(item.to_bytes(1, 'little') for item in obj)
529                if self.serializable_float:
530                    return  b''.join((int(round(item))).to_bytes(1, 'little') for item in obj)
531                else:
532                    pass
533            else:
534                pass
535        elif DataType.bytearray_ == type_id:
536            if self.serializable_bytearray:
537                return obj
538            elif self.serializable_bytes:
539                return bytearray(obj)
540            elif self.serializable_str:
541                return bytearray(bytes.fromhex(obj))
542            elif self.serializable_tuple:
543                if self.serializable_int:
544                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
545                if self.serializable_float:
546                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
547                else:
548                    pass
549            elif self.serializable_list:
550                if self.serializable_int:
551                    return  bytearray(b''.join(item.to_bytes(1, 'little') for item in obj))
552                if self.serializable_float:
553                    return  bytearray(b''.join((int(round(item))).to_bytes(1, 'little') for item in obj))
554                else:
555                    pass
556            else:
557                pass
558        elif DataType.bool_ == type_id:
559            if self.serializable_bool:
560                return obj
561            elif self.serializable_int:
562                return bool(obj)
563            elif self.serializable_bytes:
564                return bool(int.from_bytes(obj, 'little'))
565            elif self.serializable_bytearray:
566                return bool(int.from_bytes(bytes(obj), 'little'))
567            elif self.serializable_str:
568                return bool(obj)
569            elif self.serializable_float:
570                return bool(int(round(obj)))
571            else:
572                pass
573        elif DataType.none_ == type_id:
574            return None
575        elif DataType.list_ == type_id:
576            if self.serializable_list:
577                return obj
578            elif self.serializable_tuple:
579                return list(obj)
580            elif self.serializable_dict:
581                return [value for key, value in sorted(obj.items(), key=lambda x: x[0])]
582            else:
583                pass
584        elif DataType.tuple_ == type_id:
585            if self.serializable_tuple:
586                return obj
587            elif self.serializable_list:
588                return tuple(obj)
589            elif self.serializable_dict:
590                return tuple(value for key, value in sorted(obj.items(), key=lambda x: x[0]))
591            else:
592                pass
593        elif DataType.set_ == type_id:
594            if self.serializable_set:
595                return obj
596            elif self.serializable_frozenset:
597                return set(obj)
598            elif self.serializable_tuple:
599                return set(obj)
600            elif self.serializable_list:
601                return set(obj)
602            elif self.serializable_dict:
603                return set(obj.keys())
604            else:
605                pass
606        elif DataType.frozenset_ == type_id:
607            if self.serializable_frozenset:
608                return obj
609            elif self.serializable_set:
610                return frozenset(obj)
611            elif self.serializable_tuple:
612                return frozenset(obj)
613            elif self.serializable_list:
614                return frozenset(obj)
615            elif self.serializable_dict:
616                return frozenset(obj.keys())
617            else:
618                pass
619        elif DataType.dict_ == type_id:
620            if self.serializable_dict:
621                return obj
622            elif self.serializable_tuple:
623                return dict(obj)
624            elif self.serializable_list:
625                return dict(obj)
626            else:
627                pass
628        elif DataType.slice_ == type_id:
629            if self.serializable_slice:
630                return obj
631            elif self.serializable_tuple:
632                return slice(*obj)
633            elif self.serializable_list:
634                return slice(*obj)
635            elif self.serializable_dict:
636                return slice(obj[0], obj[1], obj[2])
637            else:
638                pass
639        else:
640            raise RuntimeError('Unknown type_id')
641        
642        raise CanNotAdjustFromSerializableError(f'Can not adjust from serializable. Type: {type_id}, obj: {obj}')
def serialize_container( self, type_id: DataType, obj: Any) -> Any:
654    def serialize_container(self, type_id: DataType, obj: Any) -> Any:
655        if DataType.list_ == type_id:
656            new_obj = list()
657            for item in obj:
658                result: ResultExistence[int] = self.serialize_impl(item)
659                if result:
660                    new_obj.append(result.value)
661        elif DataType.tuple_ == type_id:
662            new_obj = list()
663            for item in obj:
664                result: ResultExistence[int] = self.serialize_impl(item)
665                if result:
666                    new_obj.append(result.value)
667            
668            new_obj = tuple(new_obj)
669        elif DataType.set_ == type_id:
670            new_obj = set()
671            for item in obj:
672                result: ResultExistence[int] = self.serialize_impl(item)
673                if result:
674                    new_obj.add(result.value)
675        elif DataType.frozenset_ == type_id:
676            new_obj = set()
677            for item in obj:
678                result: ResultExistence[int] = self.serialize_impl(item)
679                if result:
680                    new_obj.add(result.value)
681                
682            new_obj = frozenset(new_obj)
683        elif DataType.dict_ == type_id:
684            new_obj = dict()
685            for key, value in obj.items():
686                key_result: ResultExistence[int] = self.serialize_impl(key)
687                value_result: ResultExistence[int] = self.serialize_impl(value)
688                if key_result and value_result:
689                    new_obj[key_result.value] = value_result.value
690        
691        return new_obj
def sc( self, type_id: DataType, obj: Any) -> Any:
654    def serialize_container(self, type_id: DataType, obj: Any) -> Any:
655        if DataType.list_ == type_id:
656            new_obj = list()
657            for item in obj:
658                result: ResultExistence[int] = self.serialize_impl(item)
659                if result:
660                    new_obj.append(result.value)
661        elif DataType.tuple_ == type_id:
662            new_obj = list()
663            for item in obj:
664                result: ResultExistence[int] = self.serialize_impl(item)
665                if result:
666                    new_obj.append(result.value)
667            
668            new_obj = tuple(new_obj)
669        elif DataType.set_ == type_id:
670            new_obj = set()
671            for item in obj:
672                result: ResultExistence[int] = self.serialize_impl(item)
673                if result:
674                    new_obj.add(result.value)
675        elif DataType.frozenset_ == type_id:
676            new_obj = set()
677            for item in obj:
678                result: ResultExistence[int] = self.serialize_impl(item)
679                if result:
680                    new_obj.add(result.value)
681                
682            new_obj = frozenset(new_obj)
683        elif DataType.dict_ == type_id:
684            new_obj = dict()
685            for key, value in obj.items():
686                key_result: ResultExistence[int] = self.serialize_impl(key)
687                value_result: ResultExistence[int] = self.serialize_impl(value)
688                if key_result and value_result:
689                    new_obj[key_result.value] = value_result.value
690        
691        return new_obj
def serialize_impl( self, obj: Any, ignore_empty_classes: bool = False) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[int]:
695    def serialize_impl(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
696        result_exists: bool = True
697        id_: int = id(obj)
698        obj_type = type(obj)
699        if (int != obj_type) and (id_ in self.objects_ids_by_id):
700            new_object: bool = False
701            object_id: int = self.objects_ids_by_id[id_]
702        else:
703            # int object must always produce new object_id because first 256 ints are persistent across Python sessions and
704            # this can cause issues within users of current module. For example within `cengal/hardware/memory/shared_memory`
705            # which changes int values inline instead of producing new objects.
706            new_object = True
707            object_id = self.objects_id_gen()
708            self.objects_ids[object_id] = id_
709            self.objects_db[object_id] = obj
710        
711        if not new_object:
712            return ResultExistence[int](result_exists, object_id)
713
714        if  self.serializable_any or (obj_type in self.serializable_data_types):
715            serializable: bool = True
716            type_id: DataType = data_type_by_type.get(obj_type, DataType.unknown_serializable)
717        else:
718            serializable = False
719            type_id = data_type_by_type.get(obj_type, DataType.class_)
720        
721        if obj_type in known_container_types:
722            known_container: bool = True
723        else:
724            known_container = False
725        
726        class_info: Dict[int, Any] = None
727        known_data: bool = None
728        class_id: int = None
729        is_new_class: bool = None
730        class_name: str = None
731        new_obj_slots: List[Tuple[str, Any]] = None
732        new_obj_dict: Dict[str, Any] = None
733        obj_mapping: Dict = None
734        obj_sequence: List = None
735        obj_set: Set = None
736        if serializable:
737            if known_container:
738                object_info = (
739                    self.ats(DataType.int_, object_id),
740                    self.ats(DataType.int_, type_id.value),
741                    self.sc(type_id, obj),
742                )
743            else:
744                object_info = (
745                    self.ats(DataType.int_, object_id),
746                    self.ats(DataType.int_, type_id.value),
747                    obj,
748                )
749        else:
750            if obj_type in known_data_types:
751                known_data = True
752            else:
753                known_data = False
754            
755            if DataType.class_ == type_id:
756                new_obj_slots = list()
757                for slot_name, slot_value in filled_slot_names_with_values_gen(obj):
758                    # if not hasattr(slot_value, '__set__'):
759                    #     # if not setable descriptor
760                    #     continue
761
762                    if self.serializable_str:
763                        adjusted_slot_name = slot_name
764                    else:
765                        adjusted_slot_name = self.ats(DataType.str_, slot_name)
766                    
767                    item_result: ResultExistence[int] = self.serialize_impl(slot_value)
768                    if item_result:
769                        if self.serializable_tuple:
770                            new_obj_slots.append((adjusted_slot_name, item_result.value))
771                        elif self.serializable_list:
772                            new_obj_slots.append([adjusted_slot_name, item_result.value])
773                        else:
774                            new_obj_slots.append(self.ats(DataType.tuple_, (adjusted_slot_name, item_result.value)))
775                
776                if new_obj_slots:
777                    if self.serializable_list:
778                        pass
779                    elif self.serializable_tuple:
780                        new_obj_slots = tuple(new_obj_slots)
781                    else:
782                        new_obj_slots = self.ats(DataType.list_, new_obj_slots)
783                
784                new_obj_dict = dict()
785                if hasattr(obj, '__dict__'):
786                    for key, value in obj.__dict__.items():
787                        # raw_value = getattr_static(obj, key)
788                        # if hasattr(raw_value, '__get__') and (not hasattr(raw_value, '__set__')):
789                        #     # if not setable descriptor
790                        #     continue
791
792                        if self.serializable_str:
793                            adjusted_key = key
794                        else:
795                            adjusted_key = self.ats(DataType.str_, key)
796
797                        value_result: ResultExistence[int] = self.serialize_impl(value)
798                        if value_result:
799                            new_obj_dict[adjusted_key] = value_result.value
800                        else:
801                            continue
802                
803                    if new_obj_dict:
804                        if self.serializable_dict:
805                            pass
806                        else:
807                            new_obj_dict = self.ats(DataType.dict_, new_obj_dict)
808                
809                obj_mapping = dict()
810                obj_sequence = list()
811                obj_set = set()
812                if isinstance(obj, MutableMapping):
813                    for key, value in obj.items():
814                        key_result: ResultExistence[int] = self.serialize_impl(value)
815                        if not key_result:
816                            continue
817
818                        value_result: ResultExistence[int] = self.serialize_impl(value)
819                        if value_result:
820                            obj_mapping[key_result.value] = value_result.value
821                        else:
822                            continue
823                    
824                    if obj_mapping:
825                        if self.serializable_dict:
826                            pass
827                        else:
828                            obj_mapping = self.ats(DataType.dict_, obj_mapping)
829                elif isinstance(obj, MutableSequence):
830                    for item in obj:
831                        item_result: ResultExistence[int] = self.serialize_impl(item)
832                        if item_result:
833                            obj_sequence.append(item_result.value)
834                        else:
835                            continue
836                    
837                    if obj_sequence:
838                        if self.serializable_list:
839                            pass
840                        else:
841                            obj_sequence = self.ats(DataType.list_, obj_sequence)
842                elif isinstance(obj, MutableSet):
843                    for item in obj:
844                        item_result: ResultExistence[int] = self.serialize_impl(item)
845                        if item_result:
846                            obj_set.add(item_result.value)
847                        else:
848                            continue
849                    
850                    if obj_set:
851                        if self.serializable_set:
852                            pass
853                        else:
854                            obj_set = self.ats(DataType.set_, obj_set)
855                else:
856                    pass
857
858                if ignore_empty_classes:
859                    result_exists = new_obj_slots or new_obj_dict or obj_mapping or obj_sequence or obj_set
860                
861                if obj_type in self.known_classes:
862                    is_new_class = False
863                    class_id = self.known_classes[obj_type]
864                else:
865                    class_info = dict()
866                    is_new_class = True
867                    class_name = obj_type.__name__
868                    class_id = self.classes_id_gen()
869                    self.known_classes[obj_type] = class_id
870                    self.known_classes_by_id[class_id] = obj_type
871                    module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(obj)
872                    adjusted_owning_names_path: List[str] = [self.ats(DataType.str_, name) for name in owning_names_path]
873                    module_importable_str_and_owning_names_path = (class_name, module_importable_str, tuple(owning_names_path))
874                    self.known_classes_info[module_importable_str_and_owning_names_path] = class_id
875                    self.known_classes_info_by_id[class_id] = module_importable_str_and_owning_names_path
876
877                    if result_exists:
878                        class_info = (
879                            self.ats(DataType.int_, class_id),
880                            self.ats(DataType.str_, class_name),
881                            self.ats(DataType.str_, module_importable_str),
882                            self.ats(DataType.list_, adjusted_owning_names_path),
883                        )
884
885                        if self.serializable_tuple:
886                            adjusted_class_info = class_info
887                        else:
888                            adjusted_class_info = self.ats(DataType.tuple_, class_info)
889                        
890                        if self.on_new_class_handler:
891                            self.on_new_class_handler(
892                                adjusted_class_info,
893                                obj_type,
894                                class_id,
895                                class_name,
896                                module_importable_str,
897                                owning_names_path,
898                                module_importable_str_and_owning_names_path
899                            )
900
901                # will be later serialized much faster than without `if else None`
902                object_info = (
903                    self.ats(DataType.int_, object_id),
904                    self.ats(DataType.int_, type_id.value),
905                    self.ats(DataType.none_, None),
906                    self.ats(DataType.int_, class_id),
907                    new_obj_slots if new_obj_slots else self.ats(DataType.list_, list()),
908                    new_obj_dict if new_obj_dict else self.ats(DataType.dict_, dict()),
909                    obj_mapping if obj_mapping else self.ats(DataType.dict_, dict()),
910                    obj_sequence if obj_sequence else self.ats(DataType.list_, list()),
911                    obj_set if obj_set else self.ats(DataType.set_, set()),
912                )
913            elif known_data:
914                object_info = (
915                    self.ats(DataType.int_, object_id),
916                    self.ats(DataType.int_, type_id.value),
917                    self.ats(type_id, obj),
918                )
919            elif known_container:
920                object_info = (
921                    self.ats(DataType.int_, object_id),
922                    self.ats(DataType.int_, type_id.value),
923                    self.ats(type_id, self.sc(type_id, obj)),
924                )
925            else:
926                raise RuntimeError('Unknown type_id')
927
928        if self.serializable_tuple:
929            adjusted_object_info = object_info
930        else:
931            adjusted_object_info = self.ats(DataType.tuple_, object_info)
932        
933        if result_exists:
934            if self.on_new_obj_info_handler:
935                self.on_new_obj_info_handler(
936                    adjusted_object_info,
937                    obj,
938                    object_id,
939                    type_id,
940                    serializable,
941                    known_container,
942                    known_data,
943                    class_id,
944                    is_new_class,
945                    new_obj_slots,
946                    new_obj_dict,
947                    obj_mapping,
948                    obj_sequence,
949                    obj_set,
950                )
951        
952        return ResultExistence[int](result_exists, object_id)
def si( self, obj: Any, ignore_empty_classes: bool = False) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[int]:
695    def serialize_impl(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
696        result_exists: bool = True
697        id_: int = id(obj)
698        obj_type = type(obj)
699        if (int != obj_type) and (id_ in self.objects_ids_by_id):
700            new_object: bool = False
701            object_id: int = self.objects_ids_by_id[id_]
702        else:
703            # int object must always produce new object_id because first 256 ints are persistent across Python sessions and
704            # this can cause issues within users of current module. For example within `cengal/hardware/memory/shared_memory`
705            # which changes int values inline instead of producing new objects.
706            new_object = True
707            object_id = self.objects_id_gen()
708            self.objects_ids[object_id] = id_
709            self.objects_db[object_id] = obj
710        
711        if not new_object:
712            return ResultExistence[int](result_exists, object_id)
713
714        if  self.serializable_any or (obj_type in self.serializable_data_types):
715            serializable: bool = True
716            type_id: DataType = data_type_by_type.get(obj_type, DataType.unknown_serializable)
717        else:
718            serializable = False
719            type_id = data_type_by_type.get(obj_type, DataType.class_)
720        
721        if obj_type in known_container_types:
722            known_container: bool = True
723        else:
724            known_container = False
725        
726        class_info: Dict[int, Any] = None
727        known_data: bool = None
728        class_id: int = None
729        is_new_class: bool = None
730        class_name: str = None
731        new_obj_slots: List[Tuple[str, Any]] = None
732        new_obj_dict: Dict[str, Any] = None
733        obj_mapping: Dict = None
734        obj_sequence: List = None
735        obj_set: Set = None
736        if serializable:
737            if known_container:
738                object_info = (
739                    self.ats(DataType.int_, object_id),
740                    self.ats(DataType.int_, type_id.value),
741                    self.sc(type_id, obj),
742                )
743            else:
744                object_info = (
745                    self.ats(DataType.int_, object_id),
746                    self.ats(DataType.int_, type_id.value),
747                    obj,
748                )
749        else:
750            if obj_type in known_data_types:
751                known_data = True
752            else:
753                known_data = False
754            
755            if DataType.class_ == type_id:
756                new_obj_slots = list()
757                for slot_name, slot_value in filled_slot_names_with_values_gen(obj):
758                    # if not hasattr(slot_value, '__set__'):
759                    #     # if not setable descriptor
760                    #     continue
761
762                    if self.serializable_str:
763                        adjusted_slot_name = slot_name
764                    else:
765                        adjusted_slot_name = self.ats(DataType.str_, slot_name)
766                    
767                    item_result: ResultExistence[int] = self.serialize_impl(slot_value)
768                    if item_result:
769                        if self.serializable_tuple:
770                            new_obj_slots.append((adjusted_slot_name, item_result.value))
771                        elif self.serializable_list:
772                            new_obj_slots.append([adjusted_slot_name, item_result.value])
773                        else:
774                            new_obj_slots.append(self.ats(DataType.tuple_, (adjusted_slot_name, item_result.value)))
775                
776                if new_obj_slots:
777                    if self.serializable_list:
778                        pass
779                    elif self.serializable_tuple:
780                        new_obj_slots = tuple(new_obj_slots)
781                    else:
782                        new_obj_slots = self.ats(DataType.list_, new_obj_slots)
783                
784                new_obj_dict = dict()
785                if hasattr(obj, '__dict__'):
786                    for key, value in obj.__dict__.items():
787                        # raw_value = getattr_static(obj, key)
788                        # if hasattr(raw_value, '__get__') and (not hasattr(raw_value, '__set__')):
789                        #     # if not setable descriptor
790                        #     continue
791
792                        if self.serializable_str:
793                            adjusted_key = key
794                        else:
795                            adjusted_key = self.ats(DataType.str_, key)
796
797                        value_result: ResultExistence[int] = self.serialize_impl(value)
798                        if value_result:
799                            new_obj_dict[adjusted_key] = value_result.value
800                        else:
801                            continue
802                
803                    if new_obj_dict:
804                        if self.serializable_dict:
805                            pass
806                        else:
807                            new_obj_dict = self.ats(DataType.dict_, new_obj_dict)
808                
809                obj_mapping = dict()
810                obj_sequence = list()
811                obj_set = set()
812                if isinstance(obj, MutableMapping):
813                    for key, value in obj.items():
814                        key_result: ResultExistence[int] = self.serialize_impl(value)
815                        if not key_result:
816                            continue
817
818                        value_result: ResultExistence[int] = self.serialize_impl(value)
819                        if value_result:
820                            obj_mapping[key_result.value] = value_result.value
821                        else:
822                            continue
823                    
824                    if obj_mapping:
825                        if self.serializable_dict:
826                            pass
827                        else:
828                            obj_mapping = self.ats(DataType.dict_, obj_mapping)
829                elif isinstance(obj, MutableSequence):
830                    for item in obj:
831                        item_result: ResultExistence[int] = self.serialize_impl(item)
832                        if item_result:
833                            obj_sequence.append(item_result.value)
834                        else:
835                            continue
836                    
837                    if obj_sequence:
838                        if self.serializable_list:
839                            pass
840                        else:
841                            obj_sequence = self.ats(DataType.list_, obj_sequence)
842                elif isinstance(obj, MutableSet):
843                    for item in obj:
844                        item_result: ResultExistence[int] = self.serialize_impl(item)
845                        if item_result:
846                            obj_set.add(item_result.value)
847                        else:
848                            continue
849                    
850                    if obj_set:
851                        if self.serializable_set:
852                            pass
853                        else:
854                            obj_set = self.ats(DataType.set_, obj_set)
855                else:
856                    pass
857
858                if ignore_empty_classes:
859                    result_exists = new_obj_slots or new_obj_dict or obj_mapping or obj_sequence or obj_set
860                
861                if obj_type in self.known_classes:
862                    is_new_class = False
863                    class_id = self.known_classes[obj_type]
864                else:
865                    class_info = dict()
866                    is_new_class = True
867                    class_name = obj_type.__name__
868                    class_id = self.classes_id_gen()
869                    self.known_classes[obj_type] = class_id
870                    self.known_classes_by_id[class_id] = obj_type
871                    module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(obj)
872                    adjusted_owning_names_path: List[str] = [self.ats(DataType.str_, name) for name in owning_names_path]
873                    module_importable_str_and_owning_names_path = (class_name, module_importable_str, tuple(owning_names_path))
874                    self.known_classes_info[module_importable_str_and_owning_names_path] = class_id
875                    self.known_classes_info_by_id[class_id] = module_importable_str_and_owning_names_path
876
877                    if result_exists:
878                        class_info = (
879                            self.ats(DataType.int_, class_id),
880                            self.ats(DataType.str_, class_name),
881                            self.ats(DataType.str_, module_importable_str),
882                            self.ats(DataType.list_, adjusted_owning_names_path),
883                        )
884
885                        if self.serializable_tuple:
886                            adjusted_class_info = class_info
887                        else:
888                            adjusted_class_info = self.ats(DataType.tuple_, class_info)
889                        
890                        if self.on_new_class_handler:
891                            self.on_new_class_handler(
892                                adjusted_class_info,
893                                obj_type,
894                                class_id,
895                                class_name,
896                                module_importable_str,
897                                owning_names_path,
898                                module_importable_str_and_owning_names_path
899                            )
900
901                # will be later serialized much faster than without `if else None`
902                object_info = (
903                    self.ats(DataType.int_, object_id),
904                    self.ats(DataType.int_, type_id.value),
905                    self.ats(DataType.none_, None),
906                    self.ats(DataType.int_, class_id),
907                    new_obj_slots if new_obj_slots else self.ats(DataType.list_, list()),
908                    new_obj_dict if new_obj_dict else self.ats(DataType.dict_, dict()),
909                    obj_mapping if obj_mapping else self.ats(DataType.dict_, dict()),
910                    obj_sequence if obj_sequence else self.ats(DataType.list_, list()),
911                    obj_set if obj_set else self.ats(DataType.set_, set()),
912                )
913            elif known_data:
914                object_info = (
915                    self.ats(DataType.int_, object_id),
916                    self.ats(DataType.int_, type_id.value),
917                    self.ats(type_id, obj),
918                )
919            elif known_container:
920                object_info = (
921                    self.ats(DataType.int_, object_id),
922                    self.ats(DataType.int_, type_id.value),
923                    self.ats(type_id, self.sc(type_id, obj)),
924                )
925            else:
926                raise RuntimeError('Unknown type_id')
927
928        if self.serializable_tuple:
929            adjusted_object_info = object_info
930        else:
931            adjusted_object_info = self.ats(DataType.tuple_, object_info)
932        
933        if result_exists:
934            if self.on_new_obj_info_handler:
935                self.on_new_obj_info_handler(
936                    adjusted_object_info,
937                    obj,
938                    object_id,
939                    type_id,
940                    serializable,
941                    known_container,
942                    known_data,
943                    class_id,
944                    is_new_class,
945                    new_obj_slots,
946                    new_obj_dict,
947                    obj_mapping,
948                    obj_sequence,
949                    obj_set,
950                )
951        
952        return ResultExistence[int](result_exists, object_id)
def serialize( self, obj: Any, ignore_empty_classes: bool = False) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[int]:
956    def serialize(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
957        with DisableGC():
958            return self.serialize_impl(obj, ignore_empty_classes)
def s( self, obj: Any, ignore_empty_classes: bool = False) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[int]:
956    def serialize(self, obj: Any, ignore_empty_classes: bool = False) -> ResultExistence[int]:
957        with DisableGC():
958            return self.serialize_impl(obj, ignore_empty_classes)
def deserialize_class_impl( self, class_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Type]]:
962    def deserialize_class_impl(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
963        if self.serializable_tuple:
964            pass
965        else:
966            class_info = self.afs(DataType.tuple_, class_info)
967
968        class_id: int = self.afs(DataType.int_, class_info[ClassInfoFields.class_id.value])
969        if class_id in self.known_classes_by_id:
970            return ResultExistence[Tuple[int, Type]](True, (class_id, self.known_classes_by_id[class_id]))
971        else:
972            class_name: str = self.afs(DataType.str_, class_info[ClassInfoFields.class_name.value])
973            module_importable_str: str = self.afs(DataType.str_, class_info[ClassInfoFields.module_importable_str.value])
974            owning_names_path: List[str] = self.afs(DataType.list_, class_info[ClassInfoFields.owning_names_path.value])
975            adjusted_owning_names_path: List[str] = [self.afs(DataType.str_, name) for name in owning_names_path]
976            obj_class: Type = entity_by_name_module_importable_str_and_owning_names_path(class_name, module_importable_str, adjusted_owning_names_path)
977            self.known_classes_by_id[class_id] = obj_class
978            self.known_classes[obj_class] = class_id
979            class_info_tuple: Tuple = (class_name, module_importable_str, tuple(owning_names_path)) 
980            self.known_classes_info[class_info_tuple] = class_id
981            self.known_classes_info_by_id[class_id] = class_info_tuple
982            return ResultExistence[Tuple[int, Type]](True, (class_id, obj_class))
def dcli( self, class_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Type]]:
962    def deserialize_class_impl(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
963        if self.serializable_tuple:
964            pass
965        else:
966            class_info = self.afs(DataType.tuple_, class_info)
967
968        class_id: int = self.afs(DataType.int_, class_info[ClassInfoFields.class_id.value])
969        if class_id in self.known_classes_by_id:
970            return ResultExistence[Tuple[int, Type]](True, (class_id, self.known_classes_by_id[class_id]))
971        else:
972            class_name: str = self.afs(DataType.str_, class_info[ClassInfoFields.class_name.value])
973            module_importable_str: str = self.afs(DataType.str_, class_info[ClassInfoFields.module_importable_str.value])
974            owning_names_path: List[str] = self.afs(DataType.list_, class_info[ClassInfoFields.owning_names_path.value])
975            adjusted_owning_names_path: List[str] = [self.afs(DataType.str_, name) for name in owning_names_path]
976            obj_class: Type = entity_by_name_module_importable_str_and_owning_names_path(class_name, module_importable_str, adjusted_owning_names_path)
977            self.known_classes_by_id[class_id] = obj_class
978            self.known_classes[obj_class] = class_id
979            class_info_tuple: Tuple = (class_name, module_importable_str, tuple(owning_names_path)) 
980            self.known_classes_info[class_info_tuple] = class_id
981            self.known_classes_info_by_id[class_id] = class_info_tuple
982            return ResultExistence[Tuple[int, Type]](True, (class_id, obj_class))
def deserialize_class( self, class_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Type]]:
986    def deserialize_class(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
987        with DisableGC():
988            return self.deserialize_class_impl(class_info)
def dcl( self, class_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Type]]:
986    def deserialize_class(self, class_info: Tuple) -> ResultExistence[Tuple[int, Type]]:
987        with DisableGC():
988            return self.deserialize_class_impl(class_info)
def deserialize_container_impl( self, type_id: DataType, obj: Any) -> Any:
 992    def deserialize_container_impl(self, type_id: DataType, obj: Any) -> Any:
 993        new_obj = obj
 994        if DataType.list_ == type_id:
 995            new_obj = list()
 996            for item_id in obj:
 997                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
 998        elif DataType.tuple_ == type_id:
 999            new_obj = list()
1000            for item_id in obj:
1001                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
1002            
1003            new_obj = tuple(new_obj)
1004        elif DataType.set_ == type_id:
1005            new_obj = set()
1006            for item_id in obj:
1007                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1008        elif DataType.frozenset_ == type_id:
1009            new_obj = set()
1010            for item_id in obj:
1011                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1012                
1013            new_obj = frozenset(new_obj)
1014        elif DataType.dict_ == type_id:
1015            new_obj = dict()
1016            for key_id, value_id in obj.items():
1017                new_obj[self.objects_db[int(self.afs(DataType.int_, key_id))]] = self.objects_db[self.afs(DataType.int_, value_id)]
1018        
1019        return new_obj
def dcoi( self, type_id: DataType, obj: Any) -> Any:
 992    def deserialize_container_impl(self, type_id: DataType, obj: Any) -> Any:
 993        new_obj = obj
 994        if DataType.list_ == type_id:
 995            new_obj = list()
 996            for item_id in obj:
 997                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
 998        elif DataType.tuple_ == type_id:
 999            new_obj = list()
1000            for item_id in obj:
1001                new_obj.append(self.objects_db[self.afs(DataType.int_, item_id)])
1002            
1003            new_obj = tuple(new_obj)
1004        elif DataType.set_ == type_id:
1005            new_obj = set()
1006            for item_id in obj:
1007                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1008        elif DataType.frozenset_ == type_id:
1009            new_obj = set()
1010            for item_id in obj:
1011                new_obj.add(self.objects_db[self.afs(DataType.int_, item_id)])
1012                
1013            new_obj = frozenset(new_obj)
1014        elif DataType.dict_ == type_id:
1015            new_obj = dict()
1016            for key_id, value_id in obj.items():
1017                new_obj[self.objects_db[int(self.afs(DataType.int_, key_id))]] = self.objects_db[self.afs(DataType.int_, value_id)]
1018        
1019        return new_obj
def deserialize_container( self, type_id: DataType, obj: Any) -> Any:
1023    def deserialize_container(self, type_id: DataType, obj: Any) -> Any:
1024        with DisableGC():
1025            return self.deserialize_container_impl(type_id, obj)
def dco( self, type_id: DataType, obj: Any) -> Any:
1023    def deserialize_container(self, type_id: DataType, obj: Any) -> Any:
1024        with DisableGC():
1025            return self.deserialize_container_impl(type_id, obj)
def deserialize_obj_impl( self, obj_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Any]]:
1029    def deserialize_obj_impl(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1030        if self.serializable_tuple:
1031            pass
1032        else:
1033            obj_info = self.afs(DataType.tuple_, obj_info)
1034        
1035        object_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.object_id.value])
1036        if object_id in self.objects_db:
1037            return ResultExistence[Tuple[int, Any]](True, (object_id, self.objects_db[object_id]))
1038        
1039        type_id: DataType = DataType(self.afs(DataType.int_, obj_info[ObjectInfoFields.type_id.value]))
1040        
1041        obj_type = data_type[type_id] 
1042        serializable: bool = self.serializable_any or (obj_type in self.serializable_data_types)
1043        known_container: bool = obj_type in known_container_types
1044        known_data: bool = None
1045        
1046        if serializable:
1047            if known_container:
1048                obj = self.dcoi(type_id, obj_info[ObjectInfoFields.object_.value])
1049            else:
1050                obj = obj_info[ObjectInfoFields.object_.value]
1051        else:
1052            known_data = obj_type in known_data_types
1053            
1054            if DataType.class_ == type_id:
1055                class_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.class_id.value])
1056                obj_class: Type = self.known_classes_by_id[class_id]
1057                obj: Any = obj_class.__new__(obj_class)
1058
1059                if obj_info[ObjectInfoFields.clonable_slots.value]:
1060                    clonable_slots = self.afs(DataType.list_, obj_info[ObjectInfoFields.clonable_slots.value])
1061                    for slot_name, slot_id in clonable_slots:
1062                        slot_name = self.afs(DataType.str_, slot_name)
1063                        slot_id = self.afs(DataType.int_, slot_id)
1064                        child_obj = self.objects_db[slot_id]
1065                        setattr(obj, slot_name, child_obj)
1066                
1067                if obj_info[ObjectInfoFields.clonable_dict_items.value]:
1068                    clonable_dict_items = self.afs(DataType.dict_, obj_info[ObjectInfoFields.clonable_dict_items.value])
1069                    for key, value_id in clonable_dict_items.items():
1070                        key = self.afs(DataType.str_, key)
1071                        value_id = self.afs(DataType.int_, value_id)
1072                        child_obj = self.objects_db[value_id]
1073                        setattr(obj, key, child_obj)
1074                
1075                if obj_info[ObjectInfoFields.contained_mapping.value]:
1076                    contained_mapping = self.afs(DataType.dict_, obj_info[ObjectInfoFields.contained_mapping.value])
1077                    for key_id, value_id in contained_mapping.items():
1078                        key_id = self.afs(DataType.int_, key_id)
1079                        value_id = self.afs(DataType.int_, value_id)
1080                        child_key = self.objects_db[int(key_id)]
1081                        child_value = self.objects_db[value_id]
1082                        obj[child_key] = child_value
1083                
1084                if obj_info[ObjectInfoFields.contained_sequence.value]:
1085                    contained_sequence = self.afs(DataType.list_, obj_info[ObjectInfoFields.contained_sequence.value])
1086                    for item_id in contained_sequence:
1087                        item_id = self.afs(DataType.int_, item_id)
1088                        child_item = self.objects_db[item_id]
1089                        obj.append(child_item)
1090                
1091                if obj_info[ObjectInfoFields.contained_set.value]:
1092                    contained_set = self.afs(DataType.set_, obj_info[ObjectInfoFields.contained_set.value])
1093                    for item_id in contained_set:
1094                        item_id = self.afs(DataType.int_, item_id)
1095                        child_item = self.objects_db[item_id]
1096                        obj.add(child_item)
1097            elif known_data:
1098                obj = self.afs(type_id, obj_info[ObjectInfoFields.object_.value])
1099            elif known_container:
1100                obj = self.dcoi(type_id, self.afs(type_id, obj_info[ObjectInfoFields.object_.value]))
1101            else:
1102                raise RuntimeError('Unknown type_id')
1103        
1104        self.objects_db[object_id] = obj
1105        id_: int = id(obj)
1106        self.objects_ids[object_id] = id_
1107        self.objects_ids_by_id[id_] = object_id
1108        return ResultExistence[Tuple[int, Any]](True, (object_id, obj))
def doi( self, obj_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Any]]:
1029    def deserialize_obj_impl(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1030        if self.serializable_tuple:
1031            pass
1032        else:
1033            obj_info = self.afs(DataType.tuple_, obj_info)
1034        
1035        object_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.object_id.value])
1036        if object_id in self.objects_db:
1037            return ResultExistence[Tuple[int, Any]](True, (object_id, self.objects_db[object_id]))
1038        
1039        type_id: DataType = DataType(self.afs(DataType.int_, obj_info[ObjectInfoFields.type_id.value]))
1040        
1041        obj_type = data_type[type_id] 
1042        serializable: bool = self.serializable_any or (obj_type in self.serializable_data_types)
1043        known_container: bool = obj_type in known_container_types
1044        known_data: bool = None
1045        
1046        if serializable:
1047            if known_container:
1048                obj = self.dcoi(type_id, obj_info[ObjectInfoFields.object_.value])
1049            else:
1050                obj = obj_info[ObjectInfoFields.object_.value]
1051        else:
1052            known_data = obj_type in known_data_types
1053            
1054            if DataType.class_ == type_id:
1055                class_id: int = self.afs(DataType.int_, obj_info[ObjectInfoFields.class_id.value])
1056                obj_class: Type = self.known_classes_by_id[class_id]
1057                obj: Any = obj_class.__new__(obj_class)
1058
1059                if obj_info[ObjectInfoFields.clonable_slots.value]:
1060                    clonable_slots = self.afs(DataType.list_, obj_info[ObjectInfoFields.clonable_slots.value])
1061                    for slot_name, slot_id in clonable_slots:
1062                        slot_name = self.afs(DataType.str_, slot_name)
1063                        slot_id = self.afs(DataType.int_, slot_id)
1064                        child_obj = self.objects_db[slot_id]
1065                        setattr(obj, slot_name, child_obj)
1066                
1067                if obj_info[ObjectInfoFields.clonable_dict_items.value]:
1068                    clonable_dict_items = self.afs(DataType.dict_, obj_info[ObjectInfoFields.clonable_dict_items.value])
1069                    for key, value_id in clonable_dict_items.items():
1070                        key = self.afs(DataType.str_, key)
1071                        value_id = self.afs(DataType.int_, value_id)
1072                        child_obj = self.objects_db[value_id]
1073                        setattr(obj, key, child_obj)
1074                
1075                if obj_info[ObjectInfoFields.contained_mapping.value]:
1076                    contained_mapping = self.afs(DataType.dict_, obj_info[ObjectInfoFields.contained_mapping.value])
1077                    for key_id, value_id in contained_mapping.items():
1078                        key_id = self.afs(DataType.int_, key_id)
1079                        value_id = self.afs(DataType.int_, value_id)
1080                        child_key = self.objects_db[int(key_id)]
1081                        child_value = self.objects_db[value_id]
1082                        obj[child_key] = child_value
1083                
1084                if obj_info[ObjectInfoFields.contained_sequence.value]:
1085                    contained_sequence = self.afs(DataType.list_, obj_info[ObjectInfoFields.contained_sequence.value])
1086                    for item_id in contained_sequence:
1087                        item_id = self.afs(DataType.int_, item_id)
1088                        child_item = self.objects_db[item_id]
1089                        obj.append(child_item)
1090                
1091                if obj_info[ObjectInfoFields.contained_set.value]:
1092                    contained_set = self.afs(DataType.set_, obj_info[ObjectInfoFields.contained_set.value])
1093                    for item_id in contained_set:
1094                        item_id = self.afs(DataType.int_, item_id)
1095                        child_item = self.objects_db[item_id]
1096                        obj.add(child_item)
1097            elif known_data:
1098                obj = self.afs(type_id, obj_info[ObjectInfoFields.object_.value])
1099            elif known_container:
1100                obj = self.dcoi(type_id, self.afs(type_id, obj_info[ObjectInfoFields.object_.value]))
1101            else:
1102                raise RuntimeError('Unknown type_id')
1103        
1104        self.objects_db[object_id] = obj
1105        id_: int = id(obj)
1106        self.objects_ids[object_id] = id_
1107        self.objects_ids_by_id[id_] = object_id
1108        return ResultExistence[Tuple[int, Any]](True, (object_id, obj))
def deserialize_obj( self, obj_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Any]]:
1112    def deserialize_obj(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1113        with DisableGC():
1114            return self.deserialize_obj_impl(obj_info)
def do( self, obj_info: Tuple) -> cengal.code_flow_control.smart_values.versions.v_2.smart_values.ResultExistence[typing.Tuple[int, typing.Any]]:
1112    def deserialize_obj(self, obj_info: Tuple) -> ResultExistence[Tuple[int, Any]]:
1113        with DisableGC():
1114            return self.deserialize_obj_impl(obj_info)