Skip to content

ding.utils.loader.mapping

ding.utils.loader.mapping

MappingError

Bases: CompositeStructureError

Overview

Mapping error.

Interfaces: __init__, errors

__init__(key_errors, value_errors)

Overview

Initialize the MappingError.

Arguments: - key_errors (:obj:MAPPING_ERRORS): The key errors. - value_errors (:obj:MAPPING_ERRORS): The value errors.

key_errors()

Overview

Get the key errors.

value_errors()

Overview

Get the value errors.

errors()

Overview

Get the errors.

mapping(key_loader, value_loader, type_back=True)

Overview

Create a mapping loader.

Arguments: - key_loader (:obj:ILoaderClass): The key loader. - value_loader (:obj:ILoaderClass): The value loader. - type_back (:obj:bool): Whether to convert the type back.

mpfilter(check, type_back=True)

Overview

Create a mapping filter loader.

Arguments: - check (:obj:Callable[[Any, Any], bool]): The check function. - type_back (:obj:bool): Whether to convert the type back.

mpkeys()

Overview

Create a mapping keys loader.

mpvalues()

Overview

Create a mapping values loader.

mpitems()

Overview

Create a mapping items loader.

item(key)

Overview

Create a item loader.

Arguments: - key (:obj:Any): The key.

item_or(key, default)

Overview

Create a item or loader.

Arguments: - key (:obj:Any): The key. - default (:obj:Any): The default value.

Full Source Code

../ding/utils/loader/mapping.py

1from typing import List, Tuple, Callable, Any 2 3from .base import ILoaderClass, Loader, CAPTURE_EXCEPTIONS 4from .exception import CompositeStructureError 5from .types import method 6from .utils import raw 7 8MAPPING_ERROR_ITEM = Tuple[str, Exception] 9MAPPING_ERRORS = List[MAPPING_ERROR_ITEM] 10 11 12class MappingError(CompositeStructureError): 13 """ 14 Overview: 15 Mapping error. 16 Interfaces: 17 ``__init__``, ``errors`` 18 """ 19 20 def __init__(self, key_errors: MAPPING_ERRORS, value_errors: MAPPING_ERRORS): 21 """ 22 Overview: 23 Initialize the MappingError. 24 Arguments: 25 - key_errors (:obj:`MAPPING_ERRORS`): The key errors. 26 - value_errors (:obj:`MAPPING_ERRORS`): The value errors. 27 """ 28 29 self.__key_errors = list(key_errors or []) 30 self.__value_errors = list(value_errors or []) 31 self.__errors = self.__key_errors + self.__value_errors 32 33 def key_errors(self) -> MAPPING_ERRORS: 34 """ 35 Overview: 36 Get the key errors. 37 """ 38 39 return self.__key_errors 40 41 def value_errors(self) -> MAPPING_ERRORS: 42 """ 43 Overview: 44 Get the value errors. 45 """ 46 47 return self.__value_errors 48 49 def errors(self) -> MAPPING_ERRORS: 50 """ 51 Overview: 52 Get the errors. 53 """ 54 55 return self.__errors 56 57 58def mapping(key_loader, value_loader, type_back: bool = True) -> ILoaderClass: 59 """ 60 Overview: 61 Create a mapping loader. 62 Arguments: 63 - key_loader (:obj:`ILoaderClass`): The key loader. 64 - value_loader (:obj:`ILoaderClass`): The value loader. 65 - type_back (:obj:`bool`): Whether to convert the type back. 66 """ 67 68 key_loader = Loader(key_loader) 69 value_loader = Loader(value_loader) 70 71 def _load(value): 72 _key_errors = [] 73 _value_errors = [] 74 _result = {} 75 for key_, value_ in value.items(): 76 key_error, value_error = None, None 77 key_result, value_result = None, None 78 79 try: 80 key_result = key_loader(key_) 81 except CAPTURE_EXCEPTIONS as err: 82 key_error = err 83 84 try: 85 value_result = value_loader(value_) 86 except CAPTURE_EXCEPTIONS as err: 87 value_error = err 88 89 if not key_error and not value_error: 90 _result[key_result] = value_result 91 else: 92 if key_error: 93 _key_errors.append((key_, key_error)) 94 if value_error: 95 _value_errors.append((key_, value_error)) 96 97 if not _key_errors and not _value_errors: 98 if type_back: 99 _result = type(value)(_result) 100 return _result 101 else: 102 raise MappingError(_key_errors, _value_errors) 103 104 return method('items') & Loader(_load) 105 106 107def mpfilter(check: Callable[[Any, Any], bool], type_back: bool = True) -> ILoaderClass: 108 """ 109 Overview: 110 Create a mapping filter loader. 111 Arguments: 112 - check (:obj:`Callable[[Any, Any], bool]`): The check function. 113 - type_back (:obj:`bool`): Whether to convert the type back. 114 """ 115 116 def _load(value): 117 _result = {key_: value_ for key_, value_ in value.items() if check(key_, value_)} 118 119 if type_back: 120 _result = type(value)(_result) 121 return _result 122 123 return method('items') & Loader(_load) 124 125 126def mpkeys() -> ILoaderClass: 127 """ 128 Overview: 129 Create a mapping keys loader. 130 """ 131 132 return method('items') & method('keys') & Loader(lambda v: set(v.keys())) 133 134 135def mpvalues() -> ILoaderClass: 136 """ 137 Overview: 138 Create a mapping values loader. 139 """ 140 141 return method('items') & method('values') & Loader(lambda v: set(v.values())) 142 143 144def mpitems() -> ILoaderClass: 145 """ 146 Overview: 147 Create a mapping items loader. 148 """ 149 150 return method('items') & Loader(lambda v: set([(key, value) for key, value in v.items()])) 151 152 153_INDEX_PRECHECK = method('__getitem__') 154 155 156def item(key) -> ILoaderClass: 157 """ 158 Overview: 159 Create a item loader. 160 Arguments: 161 - key (:obj:`Any`): The key. 162 """ 163 164 return _INDEX_PRECHECK & Loader( 165 (lambda v: key in v.keys(), lambda v: v[key], KeyError('key {key} not found'.format(key=repr(key)))) 166 ) 167 168 169def item_or(key, default) -> ILoaderClass: 170 """ 171 Overview: 172 Create a item or loader. 173 Arguments: 174 - key (:obj:`Any`): The key. 175 - default (:obj:`Any`): The default value. 176 """ 177 178 return _INDEX_PRECHECK & (item(key) | raw(default))