cengal.code_flow_control.smart_values.versions.v_2.smart_values
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__all__ = [ 19 'ValueExistenceNamedTuple', 20 'ValueExistence', 21 'ValueHolder', 22 'ResultExistence', 23 'ResultHolder', 24 'ErrorExistence', 25 'ErrorHolder', 26 'ValueCache', 27 'ValueTypeNamedTuple', 28 'ValueType', 29 'ValueWithTypeNamedTuple', 30 'ValueWithType', 31 ] 32 33 34from cengal.introspection.inspect import entity_module_importable_str_and_owning_names_path, entity_by_name_module_importable_str_and_owning_names_path 35from collections import namedtuple 36from collections.abc import Sequence 37from typing import Any, TypeVar, Generic, Tuple, NamedTuple, Union, Optional 38 39""" 40Module Docstring 41Docstrings: http://www.python.org/dev/peps/pep-0257/ 42""" 43 44__author__ = "ButenkoMS <gtalk@butenkoms.space>" 45__copyright__ = "Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>" 46__credits__ = ["ButenkoMS <gtalk@butenkoms.space>", ] 47__license__ = "Apache License, Version 2.0" 48__version__ = "4.4.1" 49__maintainer__ = "ButenkoMS <gtalk@butenkoms.space>" 50__email__ = "gtalk@butenkoms.space" 51# __status__ = "Prototype" 52__status__ = "Development" 53# __status__ = "Production" 54 55 56# TODO: implement Cython version (smart_values are used by our Cython code) 57 58 59VT = TypeVar('VT') 60 61 62ValueExistenceNamedTuple = namedtuple('ValueExistenceNamedTuple', ['existence', 'value']) 63 64 65class ValueExistence(Generic[VT], Sequence): 66 __slots__ = ('existence', '_value') 67 68 def __init__(self, existence: bool = False, value: VT = None): 69 self.existence: bool = existence 70 self._value: VT = value 71 72 def __len__(self): 73 return 2 74 75 def __getitem__(self, index): 76 if 0 == index: 77 return self.existence 78 elif 1 == index: 79 return self._value 80 else: 81 raise IndexError 82 83 @property 84 def value(self): 85 return self._value 86 87 @value.setter 88 def value(self, value): 89 self.existence = True 90 self._value = value 91 92 def __bool__(self): 93 return self.existence 94 95 def __nonzero__(self): 96 return self.__bool__() 97 98 def __str__(self): 99 return f'{type(self).__name__}({repr(self.existence)}, {repr(self.value)})' 100 101 def __repr__(self): 102 return self.__str__() 103 104 def __getstate__(self): 105 return self.existence, self.value 106 107 def __setstate__(self, state): 108 existence, value = state 109 self.value = value 110 self.existence = existence 111 112 def __eq__(self, __value: object) -> bool: 113 if isinstance(__value, ValueExistence): 114 return (self.existence == __value.existence) and (self.value == __value.value) 115 else: 116 if self.existence: 117 return self.value == __value 118 else: 119 return False 120 121 def __ne__(self, __value: object) -> bool: 122 return not self.__eq__(__value) 123 124 def to_namedtuple(self) -> ValueExistenceNamedTuple: 125 return ValueExistenceNamedTuple(self.existence, self.value) 126 127 def to_tuple(self) -> Tuple: 128 return self.existence, self.value 129 130 def to_dict(self) -> dict: 131 return { 132 'existence': self.existence, 133 'value': self.value, 134 } 135 136 def serialize_to_dict(self) -> Tuple[dict, dict]: 137 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 138 return { 139 'existence': self.existence, 140 'value': self.value, 141 }, { 142 'class_name': self.__class__, 143 'module_importable_str': module_importable_str, 144 'owning_names_path': owning_names_path, 145 } 146 147 @classmethod 148 def from_namedtuple(cls, named_tuple: ValueExistenceNamedTuple) -> 'ValueExistence': 149 return cls(named_tuple.existence, named_tuple.value) 150 151 @classmethod 152 def from_tuple(cls, tuple_: Tuple) -> 'ValueExistence': 153 return cls(*tuple_) 154 155 @classmethod 156 def from_dict(cls, dict_: dict) -> 'ValueExistence': 157 return cls(dict_['existence'], dict_['value']) 158 159 @classmethod 160 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 161 if owning_info is None: 162 return cls(dict_['existence'], dict_['value']) 163 else: 164 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 165 return class_type(dict_['existence'], dict_['value']) 166 167 @classmethod 168 def from_other(cls, value: Union['ValueExistence', ValueExistenceNamedTuple, Tuple, VT]) -> 'ValueExistence': 169 if isinstance(value, ValueExistence): 170 return cls(value.existence, value.value) 171 elif isinstance(value, ValueExistenceNamedTuple): 172 return cls.from_namedtuple(value) 173 elif isinstance(value, tuple): 174 return cls.from_tuple(value) 175 elif isinstance(value, dict): 176 return cls.from_dict(value) 177 else: 178 try: 179 return cls(value.existence, value.value) 180 except AttributeError: 181 return cls(True, value) 182 183 184class ValueHolder(ValueExistence[VT]): 185 def __init__(self, existence: bool = False, value: VT = None): 186 super().__init__(existence, value) 187 188 189class ResultExistence(ValueExistence[VT]): 190 def __init__(self, existence: bool = False, value: VT = None): 191 super().__init__(existence, value) 192 193 194class ResultHolder(ValueExistence[VT]): 195 def __init__(self, existence: bool = False, value: VT = None): 196 super().__init__(existence, value) 197 198 199class ErrorExistence(ValueExistence[VT]): 200 def __init__(self, existence: bool = False, value: VT = None): 201 super().__init__(existence, value) 202 203 204class ErrorHolder(ValueExistence[VT]): 205 def __init__(self, existence: bool = False, value: VT = None): 206 super().__init__(existence, value) 207 208 209class ValueCache(ValueExistence[VT]): 210 __slots__ = tuple() 211 212 def __init__(self, existence: bool = False, value: VT = None): 213 super(ValueCache, self).__init__(existence, value) 214 215 def __call__(self, *args, **kwargs): 216 self.existence = False 217 218 def get(self) -> VT: 219 return self.value 220 221 def set(self, new_value: VT): 222 self.existence = True 223 self.value = new_value 224 225 def reset(self): 226 self.existence = False 227 228 def __getstate__(self): 229 return self.existence, self.value 230 231 def __setstate__(self, state): 232 existence, value = state 233 self.value = value 234 self.existence = existence 235 236 def __eq__(self, __value: object) -> bool: 237 if isinstance(__value, ValueExistence): 238 return (self.existence == __value.existence) and (self.value == __value.value) 239 else: 240 if self.existence: 241 return self.value == __value 242 else: 243 return False 244 245 def __ne__(self, __value: object) -> bool: 246 return not self.__eq__(__value) 247 248 249TT = TypeVar('TT') 250 251 252ValueTypeNamedTuple = namedtuple('ValueTypeNamedTuple', ['type_id', 'value']) 253 254 255class ValueType(Generic[TT, VT], Sequence): 256 __slots__ = ('type_id', 'value') 257 258 def __init__(self, type_id: TT, value: VT): 259 self.type_id: TT = type_id 260 self.value: VT = value 261 262 def __len__(self): 263 return 2 264 265 def __getitem__(self, index): 266 if 0 == index: 267 return self.type_id 268 elif 1 == index: 269 return self.value 270 else: 271 raise IndexError 272 273 def __eq__(self, other): 274 # "__ne__() delegates to __eq__() and inverts the value" 275 if isinstance(other, (ValueType, ValueWithType)): 276 return self.type_id == other.type_id 277 else: 278 return self.type_id == other 279 280 def __getstate__(self): 281 return self.type_id, self.value 282 283 def __setstate__(self, state): 284 self.type_id, self.value = state 285 286 def __str__(self): 287 return f'{type(self).__name__}({repr(self.type_id)}, {repr(self.value)})' 288 289 def __repr__(self): 290 return self.__str__() 291 292 def to_namedtuple(self) -> ValueTypeNamedTuple: 293 return ValueTypeNamedTuple(self.type_id, self.value) 294 295 def to_tuple(self) -> Tuple: 296 return self.type_id, self.value 297 298 def to_dict(self) -> dict: 299 return { 300 'type_id': self.type_id, 301 'value': self.value, 302 } 303 304 def serialize_to_dict(self) -> Tuple[dict, dict]: 305 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 306 return { 307 'type_id': self.type_id, 308 'value': self.value, 309 }, { 310 'class_name': self.__class__, 311 'module_importable_str': module_importable_str, 312 'owning_names_path': owning_names_path, 313 } 314 315 @classmethod 316 def from_namedtuple(cls, named_tuple: ValueTypeNamedTuple) -> 'ValueExistence': 317 return cls(named_tuple.type_id, named_tuple.value) 318 319 @classmethod 320 def from_tuple(cls, tuple_: Tuple) -> 'ValueExistence': 321 return cls(*tuple_) 322 323 @classmethod 324 def from_dict(cls, dict_: dict) -> 'ValueExistence': 325 return cls(dict_['type_id'], dict_['value']) 326 327 @classmethod 328 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 329 if owning_info is None: 330 return cls(dict_['type_id'], dict_['value']) 331 else: 332 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 333 return class_type(dict_['type_id'], dict_['value']) 334 335 @classmethod 336 def from_other(cls, value: Union['ValueExistence', ValueTypeNamedTuple, Tuple, VT]) -> 'ValueExistence': 337 if isinstance(value, ValueExistence): 338 return cls(value.type_id, value.value) 339 elif isinstance(value, ValueTypeNamedTuple): 340 return cls.from_namedtuple(value) 341 elif isinstance(value, tuple): 342 return cls.from_tuple(value) 343 elif isinstance(value, dict): 344 return cls.from_dict(value) 345 else: 346 try: 347 return cls(value.type_id, value.value) 348 except AttributeError: 349 return cls(None, value) 350 351 352ValueWithTypeNamedTuple = namedtuple('ValueWithTypeNamedTuple', ['type_id', 'value']) 353 354 355class ValueWithType(Generic[TT, VT], Sequence): 356 __slots__ = ('type_id', 'value') 357 358 def __init__(self, type_id: TT, value: VT): 359 self.type_id: TT = type_id 360 self.value: VT = value 361 362 def __len__(self): 363 return 2 364 365 def __getitem__(self, index): 366 if 0 == index: 367 return self.type_id 368 elif 1 == index: 369 return self.value 370 else: 371 raise IndexError 372 373 def __eq__(self, other): 374 # "__ne__() delegates to __eq__() and inverts the value" 375 if isinstance(other, ValueType): 376 return self.type_id == other.type_id 377 elif isinstance(other, ValueWithType): 378 return (self.type_id == other.type_id) and (self.value == other.value) 379 else: 380 return self.value == other 381 382 def __getstate__(self): 383 return self.type_id, self.value 384 385 def __setstate__(self, state): 386 self.type_id, self.value = state 387 388 def __str__(self): 389 return f'{type(self).__name__}({repr(self.type_id)}, {repr(self.value)})' 390 391 def __repr__(self): 392 return self.__str__() 393 394 def to_namedtuple(self) -> ValueWithTypeNamedTuple: 395 return ValueWithTypeNamedTuple(self.type_id, self.value) 396 397 def to_tuple(self) -> Tuple: 398 return self.type_id, self.value 399 400 def to_dict(self) -> dict: 401 return { 402 'type_id': self.type_id, 403 'value': self.value, 404 } 405 406 def serialize_to_dict(self) -> Tuple[dict, dict]: 407 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 408 return { 409 'type_id': self.type_id, 410 'value': self.value, 411 }, { 412 'class_name': self.__class__, 413 'module_importable_str': module_importable_str, 414 'owning_names_path': owning_names_path, 415 } 416 417 @classmethod 418 def from_namedtuple(cls, named_tuple: ValueWithTypeNamedTuple) -> 'ValueExistence': 419 return cls(named_tuple.type_id, named_tuple.value) 420 421 @classmethod 422 def from_tuple(cls, tuple_: Tuple) -> 'ValueExistence': 423 return cls(*tuple_) 424 425 @classmethod 426 def from_dict(cls, dict_: dict) -> 'ValueExistence': 427 return cls(dict_['type_id'], dict_['value']) 428 429 @classmethod 430 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 431 if owning_info is None: 432 return cls(dict_['type_id'], dict_['value']) 433 else: 434 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 435 return class_type(dict_['type_id'], dict_['value']) 436 437 @classmethod 438 def from_other(cls, value: Union['ValueExistence', ValueWithTypeNamedTuple, Tuple, VT]) -> 'ValueExistence': 439 if isinstance(value, ValueExistence): 440 return cls(value.type_id, value.value) 441 elif isinstance(value, ValueWithTypeNamedTuple): 442 return cls.from_namedtuple(value) 443 elif isinstance(value, tuple): 444 return cls.from_tuple(value) 445 elif isinstance(value, dict): 446 return cls.from_dict(value) 447 else: 448 try: 449 return cls(value.type_id, value.value) 450 except AttributeError: 451 return cls(None, value)
ValueExistenceNamedTuple(existence, value)
Create new instance of ValueExistenceNamedTuple(existence, value)
Inherited Members
- builtins.tuple
- index
- count
66class ValueExistence(Generic[VT], Sequence): 67 __slots__ = ('existence', '_value') 68 69 def __init__(self, existence: bool = False, value: VT = None): 70 self.existence: bool = existence 71 self._value: VT = value 72 73 def __len__(self): 74 return 2 75 76 def __getitem__(self, index): 77 if 0 == index: 78 return self.existence 79 elif 1 == index: 80 return self._value 81 else: 82 raise IndexError 83 84 @property 85 def value(self): 86 return self._value 87 88 @value.setter 89 def value(self, value): 90 self.existence = True 91 self._value = value 92 93 def __bool__(self): 94 return self.existence 95 96 def __nonzero__(self): 97 return self.__bool__() 98 99 def __str__(self): 100 return f'{type(self).__name__}({repr(self.existence)}, {repr(self.value)})' 101 102 def __repr__(self): 103 return self.__str__() 104 105 def __getstate__(self): 106 return self.existence, self.value 107 108 def __setstate__(self, state): 109 existence, value = state 110 self.value = value 111 self.existence = existence 112 113 def __eq__(self, __value: object) -> bool: 114 if isinstance(__value, ValueExistence): 115 return (self.existence == __value.existence) and (self.value == __value.value) 116 else: 117 if self.existence: 118 return self.value == __value 119 else: 120 return False 121 122 def __ne__(self, __value: object) -> bool: 123 return not self.__eq__(__value) 124 125 def to_namedtuple(self) -> ValueExistenceNamedTuple: 126 return ValueExistenceNamedTuple(self.existence, self.value) 127 128 def to_tuple(self) -> Tuple: 129 return self.existence, self.value 130 131 def to_dict(self) -> dict: 132 return { 133 'existence': self.existence, 134 'value': self.value, 135 } 136 137 def serialize_to_dict(self) -> Tuple[dict, dict]: 138 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 139 return { 140 'existence': self.existence, 141 'value': self.value, 142 }, { 143 'class_name': self.__class__, 144 'module_importable_str': module_importable_str, 145 'owning_names_path': owning_names_path, 146 } 147 148 @classmethod 149 def from_namedtuple(cls, named_tuple: ValueExistenceNamedTuple) -> 'ValueExistence': 150 return cls(named_tuple.existence, named_tuple.value) 151 152 @classmethod 153 def from_tuple(cls, tuple_: Tuple) -> 'ValueExistence': 154 return cls(*tuple_) 155 156 @classmethod 157 def from_dict(cls, dict_: dict) -> 'ValueExistence': 158 return cls(dict_['existence'], dict_['value']) 159 160 @classmethod 161 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 162 if owning_info is None: 163 return cls(dict_['existence'], dict_['value']) 164 else: 165 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 166 return class_type(dict_['existence'], dict_['value']) 167 168 @classmethod 169 def from_other(cls, value: Union['ValueExistence', ValueExistenceNamedTuple, Tuple, VT]) -> 'ValueExistence': 170 if isinstance(value, ValueExistence): 171 return cls(value.existence, value.value) 172 elif isinstance(value, ValueExistenceNamedTuple): 173 return cls.from_namedtuple(value) 174 elif isinstance(value, tuple): 175 return cls.from_tuple(value) 176 elif isinstance(value, dict): 177 return cls.from_dict(value) 178 else: 179 try: 180 return cls(value.existence, value.value) 181 except AttributeError: 182 return cls(True, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
137 def serialize_to_dict(self) -> Tuple[dict, dict]: 138 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 139 return { 140 'existence': self.existence, 141 'value': self.value, 142 }, { 143 'class_name': self.__class__, 144 'module_importable_str': module_importable_str, 145 'owning_names_path': owning_names_path, 146 }
160 @classmethod 161 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 162 if owning_info is None: 163 return cls(dict_['existence'], dict_['value']) 164 else: 165 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 166 return class_type(dict_['existence'], dict_['value'])
168 @classmethod 169 def from_other(cls, value: Union['ValueExistence', ValueExistenceNamedTuple, Tuple, VT]) -> 'ValueExistence': 170 if isinstance(value, ValueExistence): 171 return cls(value.existence, value.value) 172 elif isinstance(value, ValueExistenceNamedTuple): 173 return cls.from_namedtuple(value) 174 elif isinstance(value, tuple): 175 return cls.from_tuple(value) 176 elif isinstance(value, dict): 177 return cls.from_dict(value) 178 else: 179 try: 180 return cls(value.existence, value.value) 181 except AttributeError: 182 return cls(True, value)
Inherited Members
- collections.abc.Sequence
- index
- count
185class ValueHolder(ValueExistence[VT]): 186 def __init__(self, existence: bool = False, value: VT = None): 187 super().__init__(existence, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
Inherited Members
- ValueExistence
- existence
- value
- to_namedtuple
- to_tuple
- to_dict
- serialize_to_dict
- from_namedtuple
- from_tuple
- from_dict
- deserialize_from_dict
- from_other
- collections.abc.Sequence
- index
- count
190class ResultExistence(ValueExistence[VT]): 191 def __init__(self, existence: bool = False, value: VT = None): 192 super().__init__(existence, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
Inherited Members
- ValueExistence
- existence
- value
- to_namedtuple
- to_tuple
- to_dict
- serialize_to_dict
- from_namedtuple
- from_tuple
- from_dict
- deserialize_from_dict
- from_other
- collections.abc.Sequence
- index
- count
195class ResultHolder(ValueExistence[VT]): 196 def __init__(self, existence: bool = False, value: VT = None): 197 super().__init__(existence, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
Inherited Members
- ValueExistence
- existence
- value
- to_namedtuple
- to_tuple
- to_dict
- serialize_to_dict
- from_namedtuple
- from_tuple
- from_dict
- deserialize_from_dict
- from_other
- collections.abc.Sequence
- index
- count
200class ErrorExistence(ValueExistence[VT]): 201 def __init__(self, existence: bool = False, value: VT = None): 202 super().__init__(existence, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
Inherited Members
- ValueExistence
- existence
- value
- to_namedtuple
- to_tuple
- to_dict
- serialize_to_dict
- from_namedtuple
- from_tuple
- from_dict
- deserialize_from_dict
- from_other
- collections.abc.Sequence
- index
- count
205class ErrorHolder(ValueExistence[VT]): 206 def __init__(self, existence: bool = False, value: VT = None): 207 super().__init__(existence, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
Inherited Members
- ValueExistence
- existence
- value
- to_namedtuple
- to_tuple
- to_dict
- serialize_to_dict
- from_namedtuple
- from_tuple
- from_dict
- deserialize_from_dict
- from_other
- collections.abc.Sequence
- index
- count
210class ValueCache(ValueExistence[VT]): 211 __slots__ = tuple() 212 213 def __init__(self, existence: bool = False, value: VT = None): 214 super(ValueCache, self).__init__(existence, value) 215 216 def __call__(self, *args, **kwargs): 217 self.existence = False 218 219 def get(self) -> VT: 220 return self.value 221 222 def set(self, new_value: VT): 223 self.existence = True 224 self.value = new_value 225 226 def reset(self): 227 self.existence = False 228 229 def __getstate__(self): 230 return self.existence, self.value 231 232 def __setstate__(self, state): 233 existence, value = state 234 self.value = value 235 self.existence = existence 236 237 def __eq__(self, __value: object) -> bool: 238 if isinstance(__value, ValueExistence): 239 return (self.existence == __value.existence) and (self.value == __value.value) 240 else: 241 if self.existence: 242 return self.value == __value 243 else: 244 return False 245 246 def __ne__(self, __value: object) -> bool: 247 return not self.__eq__(__value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
Inherited Members
- ValueExistence
- existence
- value
- to_namedtuple
- to_tuple
- to_dict
- serialize_to_dict
- from_namedtuple
- from_tuple
- from_dict
- deserialize_from_dict
- from_other
- collections.abc.Sequence
- index
- count
ValueTypeNamedTuple(type_id, value)
Inherited Members
- builtins.tuple
- index
- count
256class ValueType(Generic[TT, VT], Sequence): 257 __slots__ = ('type_id', 'value') 258 259 def __init__(self, type_id: TT, value: VT): 260 self.type_id: TT = type_id 261 self.value: VT = value 262 263 def __len__(self): 264 return 2 265 266 def __getitem__(self, index): 267 if 0 == index: 268 return self.type_id 269 elif 1 == index: 270 return self.value 271 else: 272 raise IndexError 273 274 def __eq__(self, other): 275 # "__ne__() delegates to __eq__() and inverts the value" 276 if isinstance(other, (ValueType, ValueWithType)): 277 return self.type_id == other.type_id 278 else: 279 return self.type_id == other 280 281 def __getstate__(self): 282 return self.type_id, self.value 283 284 def __setstate__(self, state): 285 self.type_id, self.value = state 286 287 def __str__(self): 288 return f'{type(self).__name__}({repr(self.type_id)}, {repr(self.value)})' 289 290 def __repr__(self): 291 return self.__str__() 292 293 def to_namedtuple(self) -> ValueTypeNamedTuple: 294 return ValueTypeNamedTuple(self.type_id, self.value) 295 296 def to_tuple(self) -> Tuple: 297 return self.type_id, self.value 298 299 def to_dict(self) -> dict: 300 return { 301 'type_id': self.type_id, 302 'value': self.value, 303 } 304 305 def serialize_to_dict(self) -> Tuple[dict, dict]: 306 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 307 return { 308 'type_id': self.type_id, 309 'value': self.value, 310 }, { 311 'class_name': self.__class__, 312 'module_importable_str': module_importable_str, 313 'owning_names_path': owning_names_path, 314 } 315 316 @classmethod 317 def from_namedtuple(cls, named_tuple: ValueTypeNamedTuple) -> 'ValueExistence': 318 return cls(named_tuple.type_id, named_tuple.value) 319 320 @classmethod 321 def from_tuple(cls, tuple_: Tuple) -> 'ValueExistence': 322 return cls(*tuple_) 323 324 @classmethod 325 def from_dict(cls, dict_: dict) -> 'ValueExistence': 326 return cls(dict_['type_id'], dict_['value']) 327 328 @classmethod 329 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 330 if owning_info is None: 331 return cls(dict_['type_id'], dict_['value']) 332 else: 333 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 334 return class_type(dict_['type_id'], dict_['value']) 335 336 @classmethod 337 def from_other(cls, value: Union['ValueExistence', ValueTypeNamedTuple, Tuple, VT]) -> 'ValueExistence': 338 if isinstance(value, ValueExistence): 339 return cls(value.type_id, value.value) 340 elif isinstance(value, ValueTypeNamedTuple): 341 return cls.from_namedtuple(value) 342 elif isinstance(value, tuple): 343 return cls.from_tuple(value) 344 elif isinstance(value, dict): 345 return cls.from_dict(value) 346 else: 347 try: 348 return cls(value.type_id, value.value) 349 except AttributeError: 350 return cls(None, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
305 def serialize_to_dict(self) -> Tuple[dict, dict]: 306 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 307 return { 308 'type_id': self.type_id, 309 'value': self.value, 310 }, { 311 'class_name': self.__class__, 312 'module_importable_str': module_importable_str, 313 'owning_names_path': owning_names_path, 314 }
328 @classmethod 329 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 330 if owning_info is None: 331 return cls(dict_['type_id'], dict_['value']) 332 else: 333 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 334 return class_type(dict_['type_id'], dict_['value'])
336 @classmethod 337 def from_other(cls, value: Union['ValueExistence', ValueTypeNamedTuple, Tuple, VT]) -> 'ValueExistence': 338 if isinstance(value, ValueExistence): 339 return cls(value.type_id, value.value) 340 elif isinstance(value, ValueTypeNamedTuple): 341 return cls.from_namedtuple(value) 342 elif isinstance(value, tuple): 343 return cls.from_tuple(value) 344 elif isinstance(value, dict): 345 return cls.from_dict(value) 346 else: 347 try: 348 return cls(value.type_id, value.value) 349 except AttributeError: 350 return cls(None, value)
Inherited Members
- collections.abc.Sequence
- index
- count
ValueWithTypeNamedTuple(type_id, value)
Create new instance of ValueWithTypeNamedTuple(type_id, value)
Inherited Members
- builtins.tuple
- index
- count
356class ValueWithType(Generic[TT, VT], Sequence): 357 __slots__ = ('type_id', 'value') 358 359 def __init__(self, type_id: TT, value: VT): 360 self.type_id: TT = type_id 361 self.value: VT = value 362 363 def __len__(self): 364 return 2 365 366 def __getitem__(self, index): 367 if 0 == index: 368 return self.type_id 369 elif 1 == index: 370 return self.value 371 else: 372 raise IndexError 373 374 def __eq__(self, other): 375 # "__ne__() delegates to __eq__() and inverts the value" 376 if isinstance(other, ValueType): 377 return self.type_id == other.type_id 378 elif isinstance(other, ValueWithType): 379 return (self.type_id == other.type_id) and (self.value == other.value) 380 else: 381 return self.value == other 382 383 def __getstate__(self): 384 return self.type_id, self.value 385 386 def __setstate__(self, state): 387 self.type_id, self.value = state 388 389 def __str__(self): 390 return f'{type(self).__name__}({repr(self.type_id)}, {repr(self.value)})' 391 392 def __repr__(self): 393 return self.__str__() 394 395 def to_namedtuple(self) -> ValueWithTypeNamedTuple: 396 return ValueWithTypeNamedTuple(self.type_id, self.value) 397 398 def to_tuple(self) -> Tuple: 399 return self.type_id, self.value 400 401 def to_dict(self) -> dict: 402 return { 403 'type_id': self.type_id, 404 'value': self.value, 405 } 406 407 def serialize_to_dict(self) -> Tuple[dict, dict]: 408 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 409 return { 410 'type_id': self.type_id, 411 'value': self.value, 412 }, { 413 'class_name': self.__class__, 414 'module_importable_str': module_importable_str, 415 'owning_names_path': owning_names_path, 416 } 417 418 @classmethod 419 def from_namedtuple(cls, named_tuple: ValueWithTypeNamedTuple) -> 'ValueExistence': 420 return cls(named_tuple.type_id, named_tuple.value) 421 422 @classmethod 423 def from_tuple(cls, tuple_: Tuple) -> 'ValueExistence': 424 return cls(*tuple_) 425 426 @classmethod 427 def from_dict(cls, dict_: dict) -> 'ValueExistence': 428 return cls(dict_['type_id'], dict_['value']) 429 430 @classmethod 431 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 432 if owning_info is None: 433 return cls(dict_['type_id'], dict_['value']) 434 else: 435 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 436 return class_type(dict_['type_id'], dict_['value']) 437 438 @classmethod 439 def from_other(cls, value: Union['ValueExistence', ValueWithTypeNamedTuple, Tuple, VT]) -> 'ValueExistence': 440 if isinstance(value, ValueExistence): 441 return cls(value.type_id, value.value) 442 elif isinstance(value, ValueWithTypeNamedTuple): 443 return cls.from_namedtuple(value) 444 elif isinstance(value, tuple): 445 return cls.from_tuple(value) 446 elif isinstance(value, dict): 447 return cls.from_dict(value) 448 else: 449 try: 450 return cls(value.type_id, value.value) 451 except AttributeError: 452 return cls(None, value)
Abstract base class for generic types.
A generic type is typically declared by inheriting from this class parameterized with one or more type variables. For example, a generic mapping type might be defined as::
class Mapping(Generic[KT, VT]): def __getitem__(self, key: KT) -> VT: ... # Etc.
This class can then be used as follows::
def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: try: return mapping[key] except KeyError: return default
407 def serialize_to_dict(self) -> Tuple[dict, dict]: 408 module_importable_str, owning_names_path = entity_module_importable_str_and_owning_names_path(self.__class__) 409 return { 410 'type_id': self.type_id, 411 'value': self.value, 412 }, { 413 'class_name': self.__class__, 414 'module_importable_str': module_importable_str, 415 'owning_names_path': owning_names_path, 416 }
430 @classmethod 431 def deserialize_from_dict(cls, dict_: dict, owning_info: Optional[str] = None) -> 'ValueExistence': 432 if owning_info is None: 433 return cls(dict_['type_id'], dict_['value']) 434 else: 435 class_type = entity_by_name_module_importable_str_and_owning_names_path(owning_info['class_name'], owning_info['module_importable_str'], owning_info['owning_names_path']) 436 return class_type(dict_['type_id'], dict_['value'])
438 @classmethod 439 def from_other(cls, value: Union['ValueExistence', ValueWithTypeNamedTuple, Tuple, VT]) -> 'ValueExistence': 440 if isinstance(value, ValueExistence): 441 return cls(value.type_id, value.value) 442 elif isinstance(value, ValueWithTypeNamedTuple): 443 return cls.from_namedtuple(value) 444 elif isinstance(value, tuple): 445 return cls.from_tuple(value) 446 elif isinstance(value, dict): 447 return cls.from_dict(value) 448 else: 449 try: 450 return cls(value.type_id, value.value) 451 except AttributeError: 452 return cls(None, value)
Inherited Members
- collections.abc.Sequence
- index
- count