1a5f9918aSopenharmony_ci 2a5f9918aSopenharmony_ci__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', 3a5f9918aSopenharmony_ci 'RepresenterError'] 4a5f9918aSopenharmony_ci 5a5f9918aSopenharmony_cifrom .error import * 6a5f9918aSopenharmony_cifrom .nodes import * 7a5f9918aSopenharmony_ci 8a5f9918aSopenharmony_ciimport datetime, copyreg, types, base64, collections 9a5f9918aSopenharmony_ci 10a5f9918aSopenharmony_ciclass RepresenterError(YAMLError): 11a5f9918aSopenharmony_ci pass 12a5f9918aSopenharmony_ci 13a5f9918aSopenharmony_ciclass BaseRepresenter: 14a5f9918aSopenharmony_ci 15a5f9918aSopenharmony_ci yaml_representers = {} 16a5f9918aSopenharmony_ci yaml_multi_representers = {} 17a5f9918aSopenharmony_ci 18a5f9918aSopenharmony_ci def __init__(self, default_style=None, default_flow_style=False, sort_keys=True): 19a5f9918aSopenharmony_ci self.default_style = default_style 20a5f9918aSopenharmony_ci self.sort_keys = sort_keys 21a5f9918aSopenharmony_ci self.default_flow_style = default_flow_style 22a5f9918aSopenharmony_ci self.represented_objects = {} 23a5f9918aSopenharmony_ci self.object_keeper = [] 24a5f9918aSopenharmony_ci self.alias_key = None 25a5f9918aSopenharmony_ci 26a5f9918aSopenharmony_ci def represent(self, data): 27a5f9918aSopenharmony_ci node = self.represent_data(data) 28a5f9918aSopenharmony_ci self.serialize(node) 29a5f9918aSopenharmony_ci self.represented_objects = {} 30a5f9918aSopenharmony_ci self.object_keeper = [] 31a5f9918aSopenharmony_ci self.alias_key = None 32a5f9918aSopenharmony_ci 33a5f9918aSopenharmony_ci def represent_data(self, data): 34a5f9918aSopenharmony_ci if self.ignore_aliases(data): 35a5f9918aSopenharmony_ci self.alias_key = None 36a5f9918aSopenharmony_ci else: 37a5f9918aSopenharmony_ci self.alias_key = id(data) 38a5f9918aSopenharmony_ci if self.alias_key is not None: 39a5f9918aSopenharmony_ci if self.alias_key in self.represented_objects: 40a5f9918aSopenharmony_ci node = self.represented_objects[self.alias_key] 41a5f9918aSopenharmony_ci #if node is None: 42a5f9918aSopenharmony_ci # raise RepresenterError("recursive objects are not allowed: %r" % data) 43a5f9918aSopenharmony_ci return node 44a5f9918aSopenharmony_ci #self.represented_objects[alias_key] = None 45a5f9918aSopenharmony_ci self.object_keeper.append(data) 46a5f9918aSopenharmony_ci data_types = type(data).__mro__ 47a5f9918aSopenharmony_ci if data_types[0] in self.yaml_representers: 48a5f9918aSopenharmony_ci node = self.yaml_representers[data_types[0]](self, data) 49a5f9918aSopenharmony_ci else: 50a5f9918aSopenharmony_ci for data_type in data_types: 51a5f9918aSopenharmony_ci if data_type in self.yaml_multi_representers: 52a5f9918aSopenharmony_ci node = self.yaml_multi_representers[data_type](self, data) 53a5f9918aSopenharmony_ci break 54a5f9918aSopenharmony_ci else: 55a5f9918aSopenharmony_ci if None in self.yaml_multi_representers: 56a5f9918aSopenharmony_ci node = self.yaml_multi_representers[None](self, data) 57a5f9918aSopenharmony_ci elif None in self.yaml_representers: 58a5f9918aSopenharmony_ci node = self.yaml_representers[None](self, data) 59a5f9918aSopenharmony_ci else: 60a5f9918aSopenharmony_ci node = ScalarNode(None, str(data)) 61a5f9918aSopenharmony_ci #if alias_key is not None: 62a5f9918aSopenharmony_ci # self.represented_objects[alias_key] = node 63a5f9918aSopenharmony_ci return node 64a5f9918aSopenharmony_ci 65a5f9918aSopenharmony_ci @classmethod 66a5f9918aSopenharmony_ci def add_representer(cls, data_type, representer): 67a5f9918aSopenharmony_ci if not 'yaml_representers' in cls.__dict__: 68a5f9918aSopenharmony_ci cls.yaml_representers = cls.yaml_representers.copy() 69a5f9918aSopenharmony_ci cls.yaml_representers[data_type] = representer 70a5f9918aSopenharmony_ci 71a5f9918aSopenharmony_ci @classmethod 72a5f9918aSopenharmony_ci def add_multi_representer(cls, data_type, representer): 73a5f9918aSopenharmony_ci if not 'yaml_multi_representers' in cls.__dict__: 74a5f9918aSopenharmony_ci cls.yaml_multi_representers = cls.yaml_multi_representers.copy() 75a5f9918aSopenharmony_ci cls.yaml_multi_representers[data_type] = representer 76a5f9918aSopenharmony_ci 77a5f9918aSopenharmony_ci def represent_scalar(self, tag, value, style=None): 78a5f9918aSopenharmony_ci if style is None: 79a5f9918aSopenharmony_ci style = self.default_style 80a5f9918aSopenharmony_ci node = ScalarNode(tag, value, style=style) 81a5f9918aSopenharmony_ci if self.alias_key is not None: 82a5f9918aSopenharmony_ci self.represented_objects[self.alias_key] = node 83a5f9918aSopenharmony_ci return node 84a5f9918aSopenharmony_ci 85a5f9918aSopenharmony_ci def represent_sequence(self, tag, sequence, flow_style=None): 86a5f9918aSopenharmony_ci value = [] 87a5f9918aSopenharmony_ci node = SequenceNode(tag, value, flow_style=flow_style) 88a5f9918aSopenharmony_ci if self.alias_key is not None: 89a5f9918aSopenharmony_ci self.represented_objects[self.alias_key] = node 90a5f9918aSopenharmony_ci best_style = True 91a5f9918aSopenharmony_ci for item in sequence: 92a5f9918aSopenharmony_ci node_item = self.represent_data(item) 93a5f9918aSopenharmony_ci if not (isinstance(node_item, ScalarNode) and not node_item.style): 94a5f9918aSopenharmony_ci best_style = False 95a5f9918aSopenharmony_ci value.append(node_item) 96a5f9918aSopenharmony_ci if flow_style is None: 97a5f9918aSopenharmony_ci if self.default_flow_style is not None: 98a5f9918aSopenharmony_ci node.flow_style = self.default_flow_style 99a5f9918aSopenharmony_ci else: 100a5f9918aSopenharmony_ci node.flow_style = best_style 101a5f9918aSopenharmony_ci return node 102a5f9918aSopenharmony_ci 103a5f9918aSopenharmony_ci def represent_mapping(self, tag, mapping, flow_style=None): 104a5f9918aSopenharmony_ci value = [] 105a5f9918aSopenharmony_ci node = MappingNode(tag, value, flow_style=flow_style) 106a5f9918aSopenharmony_ci if self.alias_key is not None: 107a5f9918aSopenharmony_ci self.represented_objects[self.alias_key] = node 108a5f9918aSopenharmony_ci best_style = True 109a5f9918aSopenharmony_ci if hasattr(mapping, 'items'): 110a5f9918aSopenharmony_ci mapping = list(mapping.items()) 111a5f9918aSopenharmony_ci if self.sort_keys: 112a5f9918aSopenharmony_ci try: 113a5f9918aSopenharmony_ci mapping = sorted(mapping) 114a5f9918aSopenharmony_ci except TypeError: 115a5f9918aSopenharmony_ci pass 116a5f9918aSopenharmony_ci for item_key, item_value in mapping: 117a5f9918aSopenharmony_ci node_key = self.represent_data(item_key) 118a5f9918aSopenharmony_ci node_value = self.represent_data(item_value) 119a5f9918aSopenharmony_ci if not (isinstance(node_key, ScalarNode) and not node_key.style): 120a5f9918aSopenharmony_ci best_style = False 121a5f9918aSopenharmony_ci if not (isinstance(node_value, ScalarNode) and not node_value.style): 122a5f9918aSopenharmony_ci best_style = False 123a5f9918aSopenharmony_ci value.append((node_key, node_value)) 124a5f9918aSopenharmony_ci if flow_style is None: 125a5f9918aSopenharmony_ci if self.default_flow_style is not None: 126a5f9918aSopenharmony_ci node.flow_style = self.default_flow_style 127a5f9918aSopenharmony_ci else: 128a5f9918aSopenharmony_ci node.flow_style = best_style 129a5f9918aSopenharmony_ci return node 130a5f9918aSopenharmony_ci 131a5f9918aSopenharmony_ci def ignore_aliases(self, data): 132a5f9918aSopenharmony_ci return False 133a5f9918aSopenharmony_ci 134a5f9918aSopenharmony_ciclass SafeRepresenter(BaseRepresenter): 135a5f9918aSopenharmony_ci 136a5f9918aSopenharmony_ci def ignore_aliases(self, data): 137a5f9918aSopenharmony_ci if data is None: 138a5f9918aSopenharmony_ci return True 139a5f9918aSopenharmony_ci if isinstance(data, tuple) and data == (): 140a5f9918aSopenharmony_ci return True 141a5f9918aSopenharmony_ci if isinstance(data, (str, bytes, bool, int, float)): 142a5f9918aSopenharmony_ci return True 143a5f9918aSopenharmony_ci 144a5f9918aSopenharmony_ci def represent_none(self, data): 145a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:null', 'null') 146a5f9918aSopenharmony_ci 147a5f9918aSopenharmony_ci def represent_str(self, data): 148a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:str', data) 149a5f9918aSopenharmony_ci 150a5f9918aSopenharmony_ci def represent_binary(self, data): 151a5f9918aSopenharmony_ci if hasattr(base64, 'encodebytes'): 152a5f9918aSopenharmony_ci data = base64.encodebytes(data).decode('ascii') 153a5f9918aSopenharmony_ci else: 154a5f9918aSopenharmony_ci data = base64.encodestring(data).decode('ascii') 155a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') 156a5f9918aSopenharmony_ci 157a5f9918aSopenharmony_ci def represent_bool(self, data): 158a5f9918aSopenharmony_ci if data: 159a5f9918aSopenharmony_ci value = 'true' 160a5f9918aSopenharmony_ci else: 161a5f9918aSopenharmony_ci value = 'false' 162a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:bool', value) 163a5f9918aSopenharmony_ci 164a5f9918aSopenharmony_ci def represent_int(self, data): 165a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:int', str(data)) 166a5f9918aSopenharmony_ci 167a5f9918aSopenharmony_ci inf_value = 1e300 168a5f9918aSopenharmony_ci while repr(inf_value) != repr(inf_value*inf_value): 169a5f9918aSopenharmony_ci inf_value *= inf_value 170a5f9918aSopenharmony_ci 171a5f9918aSopenharmony_ci def represent_float(self, data): 172a5f9918aSopenharmony_ci if data != data or (data == 0.0 and data == 1.0): 173a5f9918aSopenharmony_ci value = '.nan' 174a5f9918aSopenharmony_ci elif data == self.inf_value: 175a5f9918aSopenharmony_ci value = '.inf' 176a5f9918aSopenharmony_ci elif data == -self.inf_value: 177a5f9918aSopenharmony_ci value = '-.inf' 178a5f9918aSopenharmony_ci else: 179a5f9918aSopenharmony_ci value = repr(data).lower() 180a5f9918aSopenharmony_ci # Note that in some cases `repr(data)` represents a float number 181a5f9918aSopenharmony_ci # without the decimal parts. For instance: 182a5f9918aSopenharmony_ci # >>> repr(1e17) 183a5f9918aSopenharmony_ci # '1e17' 184a5f9918aSopenharmony_ci # Unfortunately, this is not a valid float representation according 185a5f9918aSopenharmony_ci # to the definition of the `!!float` tag. We fix this by adding 186a5f9918aSopenharmony_ci # '.0' before the 'e' symbol. 187a5f9918aSopenharmony_ci if '.' not in value and 'e' in value: 188a5f9918aSopenharmony_ci value = value.replace('e', '.0e', 1) 189a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:float', value) 190a5f9918aSopenharmony_ci 191a5f9918aSopenharmony_ci def represent_list(self, data): 192a5f9918aSopenharmony_ci #pairs = (len(data) > 0 and isinstance(data, list)) 193a5f9918aSopenharmony_ci #if pairs: 194a5f9918aSopenharmony_ci # for item in data: 195a5f9918aSopenharmony_ci # if not isinstance(item, tuple) or len(item) != 2: 196a5f9918aSopenharmony_ci # pairs = False 197a5f9918aSopenharmony_ci # break 198a5f9918aSopenharmony_ci #if not pairs: 199a5f9918aSopenharmony_ci return self.represent_sequence('tag:yaml.org,2002:seq', data) 200a5f9918aSopenharmony_ci #value = [] 201a5f9918aSopenharmony_ci #for item_key, item_value in data: 202a5f9918aSopenharmony_ci # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', 203a5f9918aSopenharmony_ci # [(item_key, item_value)])) 204a5f9918aSopenharmony_ci #return SequenceNode(u'tag:yaml.org,2002:pairs', value) 205a5f9918aSopenharmony_ci 206a5f9918aSopenharmony_ci def represent_dict(self, data): 207a5f9918aSopenharmony_ci return self.represent_mapping('tag:yaml.org,2002:map', data) 208a5f9918aSopenharmony_ci 209a5f9918aSopenharmony_ci def represent_set(self, data): 210a5f9918aSopenharmony_ci value = {} 211a5f9918aSopenharmony_ci for key in data: 212a5f9918aSopenharmony_ci value[key] = None 213a5f9918aSopenharmony_ci return self.represent_mapping('tag:yaml.org,2002:set', value) 214a5f9918aSopenharmony_ci 215a5f9918aSopenharmony_ci def represent_date(self, data): 216a5f9918aSopenharmony_ci value = data.isoformat() 217a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:timestamp', value) 218a5f9918aSopenharmony_ci 219a5f9918aSopenharmony_ci def represent_datetime(self, data): 220a5f9918aSopenharmony_ci value = data.isoformat(' ') 221a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:timestamp', value) 222a5f9918aSopenharmony_ci 223a5f9918aSopenharmony_ci def represent_yaml_object(self, tag, data, cls, flow_style=None): 224a5f9918aSopenharmony_ci if hasattr(data, '__getstate__'): 225a5f9918aSopenharmony_ci state = data.__getstate__() 226a5f9918aSopenharmony_ci else: 227a5f9918aSopenharmony_ci state = data.__dict__.copy() 228a5f9918aSopenharmony_ci return self.represent_mapping(tag, state, flow_style=flow_style) 229a5f9918aSopenharmony_ci 230a5f9918aSopenharmony_ci def represent_undefined(self, data): 231a5f9918aSopenharmony_ci raise RepresenterError("cannot represent an object", data) 232a5f9918aSopenharmony_ci 233a5f9918aSopenharmony_ciSafeRepresenter.add_representer(type(None), 234a5f9918aSopenharmony_ci SafeRepresenter.represent_none) 235a5f9918aSopenharmony_ci 236a5f9918aSopenharmony_ciSafeRepresenter.add_representer(str, 237a5f9918aSopenharmony_ci SafeRepresenter.represent_str) 238a5f9918aSopenharmony_ci 239a5f9918aSopenharmony_ciSafeRepresenter.add_representer(bytes, 240a5f9918aSopenharmony_ci SafeRepresenter.represent_binary) 241a5f9918aSopenharmony_ci 242a5f9918aSopenharmony_ciSafeRepresenter.add_representer(bool, 243a5f9918aSopenharmony_ci SafeRepresenter.represent_bool) 244a5f9918aSopenharmony_ci 245a5f9918aSopenharmony_ciSafeRepresenter.add_representer(int, 246a5f9918aSopenharmony_ci SafeRepresenter.represent_int) 247a5f9918aSopenharmony_ci 248a5f9918aSopenharmony_ciSafeRepresenter.add_representer(float, 249a5f9918aSopenharmony_ci SafeRepresenter.represent_float) 250a5f9918aSopenharmony_ci 251a5f9918aSopenharmony_ciSafeRepresenter.add_representer(list, 252a5f9918aSopenharmony_ci SafeRepresenter.represent_list) 253a5f9918aSopenharmony_ci 254a5f9918aSopenharmony_ciSafeRepresenter.add_representer(tuple, 255a5f9918aSopenharmony_ci SafeRepresenter.represent_list) 256a5f9918aSopenharmony_ci 257a5f9918aSopenharmony_ciSafeRepresenter.add_representer(dict, 258a5f9918aSopenharmony_ci SafeRepresenter.represent_dict) 259a5f9918aSopenharmony_ci 260a5f9918aSopenharmony_ciSafeRepresenter.add_representer(set, 261a5f9918aSopenharmony_ci SafeRepresenter.represent_set) 262a5f9918aSopenharmony_ci 263a5f9918aSopenharmony_ciSafeRepresenter.add_representer(datetime.date, 264a5f9918aSopenharmony_ci SafeRepresenter.represent_date) 265a5f9918aSopenharmony_ci 266a5f9918aSopenharmony_ciSafeRepresenter.add_representer(datetime.datetime, 267a5f9918aSopenharmony_ci SafeRepresenter.represent_datetime) 268a5f9918aSopenharmony_ci 269a5f9918aSopenharmony_ciSafeRepresenter.add_representer(None, 270a5f9918aSopenharmony_ci SafeRepresenter.represent_undefined) 271a5f9918aSopenharmony_ci 272a5f9918aSopenharmony_ciclass Representer(SafeRepresenter): 273a5f9918aSopenharmony_ci 274a5f9918aSopenharmony_ci def represent_complex(self, data): 275a5f9918aSopenharmony_ci if data.imag == 0.0: 276a5f9918aSopenharmony_ci data = '%r' % data.real 277a5f9918aSopenharmony_ci elif data.real == 0.0: 278a5f9918aSopenharmony_ci data = '%rj' % data.imag 279a5f9918aSopenharmony_ci elif data.imag > 0: 280a5f9918aSopenharmony_ci data = '%r+%rj' % (data.real, data.imag) 281a5f9918aSopenharmony_ci else: 282a5f9918aSopenharmony_ci data = '%r%rj' % (data.real, data.imag) 283a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:python/complex', data) 284a5f9918aSopenharmony_ci 285a5f9918aSopenharmony_ci def represent_tuple(self, data): 286a5f9918aSopenharmony_ci return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) 287a5f9918aSopenharmony_ci 288a5f9918aSopenharmony_ci def represent_name(self, data): 289a5f9918aSopenharmony_ci name = '%s.%s' % (data.__module__, data.__name__) 290a5f9918aSopenharmony_ci return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') 291a5f9918aSopenharmony_ci 292a5f9918aSopenharmony_ci def represent_module(self, data): 293a5f9918aSopenharmony_ci return self.represent_scalar( 294a5f9918aSopenharmony_ci 'tag:yaml.org,2002:python/module:'+data.__name__, '') 295a5f9918aSopenharmony_ci 296a5f9918aSopenharmony_ci def represent_object(self, data): 297a5f9918aSopenharmony_ci # We use __reduce__ API to save the data. data.__reduce__ returns 298a5f9918aSopenharmony_ci # a tuple of length 2-5: 299a5f9918aSopenharmony_ci # (function, args, state, listitems, dictitems) 300a5f9918aSopenharmony_ci 301a5f9918aSopenharmony_ci # For reconstructing, we calls function(*args), then set its state, 302a5f9918aSopenharmony_ci # listitems, and dictitems if they are not None. 303a5f9918aSopenharmony_ci 304a5f9918aSopenharmony_ci # A special case is when function.__name__ == '__newobj__'. In this 305a5f9918aSopenharmony_ci # case we create the object with args[0].__new__(*args). 306a5f9918aSopenharmony_ci 307a5f9918aSopenharmony_ci # Another special case is when __reduce__ returns a string - we don't 308a5f9918aSopenharmony_ci # support it. 309a5f9918aSopenharmony_ci 310a5f9918aSopenharmony_ci # We produce a !!python/object, !!python/object/new or 311a5f9918aSopenharmony_ci # !!python/object/apply node. 312a5f9918aSopenharmony_ci 313a5f9918aSopenharmony_ci cls = type(data) 314a5f9918aSopenharmony_ci if cls in copyreg.dispatch_table: 315a5f9918aSopenharmony_ci reduce = copyreg.dispatch_table[cls](data) 316a5f9918aSopenharmony_ci elif hasattr(data, '__reduce_ex__'): 317a5f9918aSopenharmony_ci reduce = data.__reduce_ex__(2) 318a5f9918aSopenharmony_ci elif hasattr(data, '__reduce__'): 319a5f9918aSopenharmony_ci reduce = data.__reduce__() 320a5f9918aSopenharmony_ci else: 321a5f9918aSopenharmony_ci raise RepresenterError("cannot represent an object", data) 322a5f9918aSopenharmony_ci reduce = (list(reduce)+[None]*5)[:5] 323a5f9918aSopenharmony_ci function, args, state, listitems, dictitems = reduce 324a5f9918aSopenharmony_ci args = list(args) 325a5f9918aSopenharmony_ci if state is None: 326a5f9918aSopenharmony_ci state = {} 327a5f9918aSopenharmony_ci if listitems is not None: 328a5f9918aSopenharmony_ci listitems = list(listitems) 329a5f9918aSopenharmony_ci if dictitems is not None: 330a5f9918aSopenharmony_ci dictitems = dict(dictitems) 331a5f9918aSopenharmony_ci if function.__name__ == '__newobj__': 332a5f9918aSopenharmony_ci function = args[0] 333a5f9918aSopenharmony_ci args = args[1:] 334a5f9918aSopenharmony_ci tag = 'tag:yaml.org,2002:python/object/new:' 335a5f9918aSopenharmony_ci newobj = True 336a5f9918aSopenharmony_ci else: 337a5f9918aSopenharmony_ci tag = 'tag:yaml.org,2002:python/object/apply:' 338a5f9918aSopenharmony_ci newobj = False 339a5f9918aSopenharmony_ci function_name = '%s.%s' % (function.__module__, function.__name__) 340a5f9918aSopenharmony_ci if not args and not listitems and not dictitems \ 341a5f9918aSopenharmony_ci and isinstance(state, dict) and newobj: 342a5f9918aSopenharmony_ci return self.represent_mapping( 343a5f9918aSopenharmony_ci 'tag:yaml.org,2002:python/object:'+function_name, state) 344a5f9918aSopenharmony_ci if not listitems and not dictitems \ 345a5f9918aSopenharmony_ci and isinstance(state, dict) and not state: 346a5f9918aSopenharmony_ci return self.represent_sequence(tag+function_name, args) 347a5f9918aSopenharmony_ci value = {} 348a5f9918aSopenharmony_ci if args: 349a5f9918aSopenharmony_ci value['args'] = args 350a5f9918aSopenharmony_ci if state or not isinstance(state, dict): 351a5f9918aSopenharmony_ci value['state'] = state 352a5f9918aSopenharmony_ci if listitems: 353a5f9918aSopenharmony_ci value['listitems'] = listitems 354a5f9918aSopenharmony_ci if dictitems: 355a5f9918aSopenharmony_ci value['dictitems'] = dictitems 356a5f9918aSopenharmony_ci return self.represent_mapping(tag+function_name, value) 357a5f9918aSopenharmony_ci 358a5f9918aSopenharmony_ci def represent_ordered_dict(self, data): 359a5f9918aSopenharmony_ci # Provide uniform representation across different Python versions. 360a5f9918aSopenharmony_ci data_type = type(data) 361a5f9918aSopenharmony_ci tag = 'tag:yaml.org,2002:python/object/apply:%s.%s' \ 362a5f9918aSopenharmony_ci % (data_type.__module__, data_type.__name__) 363a5f9918aSopenharmony_ci items = [[key, value] for key, value in data.items()] 364a5f9918aSopenharmony_ci return self.represent_sequence(tag, [items]) 365a5f9918aSopenharmony_ci 366a5f9918aSopenharmony_ciRepresenter.add_representer(complex, 367a5f9918aSopenharmony_ci Representer.represent_complex) 368a5f9918aSopenharmony_ci 369a5f9918aSopenharmony_ciRepresenter.add_representer(tuple, 370a5f9918aSopenharmony_ci Representer.represent_tuple) 371a5f9918aSopenharmony_ci 372a5f9918aSopenharmony_ciRepresenter.add_multi_representer(type, 373a5f9918aSopenharmony_ci Representer.represent_name) 374a5f9918aSopenharmony_ci 375a5f9918aSopenharmony_ciRepresenter.add_representer(collections.OrderedDict, 376a5f9918aSopenharmony_ci Representer.represent_ordered_dict) 377a5f9918aSopenharmony_ci 378a5f9918aSopenharmony_ciRepresenter.add_representer(types.FunctionType, 379a5f9918aSopenharmony_ci Representer.represent_name) 380a5f9918aSopenharmony_ci 381a5f9918aSopenharmony_ciRepresenter.add_representer(types.BuiltinFunctionType, 382a5f9918aSopenharmony_ci Representer.represent_name) 383a5f9918aSopenharmony_ci 384a5f9918aSopenharmony_ciRepresenter.add_representer(types.ModuleType, 385a5f9918aSopenharmony_ci Representer.represent_module) 386a5f9918aSopenharmony_ci 387a5f9918aSopenharmony_ciRepresenter.add_multi_representer(object, 388a5f9918aSopenharmony_ci Representer.represent_object) 389a5f9918aSopenharmony_ci 390