Changeset 328 for pyyaml/trunk/lib3/yaml/representer.py
- Timestamp:
- 12/29/08 12:24:05 (4 years ago)
- Location:
- pyyaml/trunk/lib3
- Files:
-
- 1 edited
- 1 copied
-
. (copied) (copied from pyyaml/trunk/lib)
-
yaml/representer.py (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
pyyaml/trunk/lib3/yaml/representer.py
r248 r328 3 3 'RepresenterError'] 4 4 5 from error import * 6 from nodes import * 7 8 import datetime 9 10 try: 11 set 12 except NameError: 13 from sets import Set as set 14 15 import sys, copy_reg, types 5 from .error import * 6 from .nodes import * 7 8 import datetime, sys, copyreg, types, base64 16 9 17 10 class RepresenterError(YAMLError): 18 11 pass 19 12 20 class BaseRepresenter (object):13 class BaseRepresenter: 21 14 22 15 yaml_representers = {} … … 36 29 self.object_keeper = [] 37 30 self.alias_key = None 38 39 def get_classobj_bases(self, cls):40 bases = [cls]41 for base in cls.__bases__:42 bases.extend(self.get_classobj_bases(base))43 return bases44 31 45 32 def represent_data(self, data): … … 57 44 self.object_keeper.append(data) 58 45 data_types = type(data).__mro__ 59 if type(data) is types.InstanceType:60 data_types = self.get_classobj_bases(data.__class__)+list(data_types)61 46 if data_types[0] in self.yaml_representers: 62 47 node = self.yaml_representers[data_types[0]](self, data) … … 72 57 node = self.yaml_representers[None](self, data) 73 58 else: 74 node = ScalarNode(None, unicode(data))59 node = ScalarNode(None, str(data)) 75 60 #if alias_key is not None: 76 61 # self.represented_objects[alias_key] = node 77 62 return node 78 63 64 @classmethod 79 65 def add_representer(cls, data_type, representer): 80 66 if not 'yaml_representers' in cls.__dict__: 81 67 cls.yaml_representers = cls.yaml_representers.copy() 82 68 cls.yaml_representers[data_type] = representer 83 add_representer = classmethod(add_representer) 84 69 70 @classmethod 85 71 def add_multi_representer(cls, data_type, representer): 86 72 if not 'yaml_multi_representers' in cls.__dict__: 87 73 cls.yaml_multi_representers = cls.yaml_multi_representers.copy() 88 74 cls.yaml_multi_representers[data_type] = representer 89 add_multi_representer = classmethod(add_multi_representer)90 75 91 76 def represent_scalar(self, tag, value, style=None): … … 122 107 best_style = True 123 108 if hasattr(mapping, 'items'): 124 mapping = mapping.items() 125 mapping.sort() 109 mapping = list(mapping.items()) 110 try: 111 mapping = sorted(mapping) 112 except TypeError: 113 pass 126 114 for item_key, item_value in mapping: 127 115 node_key = self.represent_data(item_key) … … 147 135 if data in [None, ()]: 148 136 return True 149 if isinstance(data, (str, unicode, bool, int, float)):137 if isinstance(data, (str, bytes, bool, int, float)): 150 138 return True 151 139 152 140 def represent_none(self, data): 153 return self.represent_scalar(u'tag:yaml.org,2002:null', 154 u'null') 141 return self.represent_scalar('tag:yaml.org,2002:null', 'null') 155 142 156 143 def represent_str(self, data): 157 tag = None 158 style = None 159 try: 160 data = unicode(data, 'ascii') 161 tag = u'tag:yaml.org,2002:str' 162 except UnicodeDecodeError: 163 try: 164 data = unicode(data, 'utf-8') 165 tag = u'tag:yaml.org,2002:str' 166 except UnicodeDecodeError: 167 data = data.encode('base64') 168 tag = u'tag:yaml.org,2002:binary' 169 style = '|' 170 return self.represent_scalar(tag, data, style=style) 171 172 def represent_unicode(self, data): 173 return self.represent_scalar(u'tag:yaml.org,2002:str', data) 144 return self.represent_scalar('tag:yaml.org,2002:str', data) 145 146 def represent_binary(self, data): 147 data = base64.encodestring(data).decode('ascii') 148 return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') 174 149 175 150 def represent_bool(self, data): 176 151 if data: 177 value = u'true'178 else: 179 value = u'false'180 return self.represent_scalar( u'tag:yaml.org,2002:bool', value)152 value = 'true' 153 else: 154 value = 'false' 155 return self.represent_scalar('tag:yaml.org,2002:bool', value) 181 156 182 157 def represent_int(self, data): 183 return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) 184 185 def represent_long(self, data): 186 return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) 158 return self.represent_scalar('tag:yaml.org,2002:int', str(data)) 187 159 188 160 inf_value = 1e300 … … 192 164 def represent_float(self, data): 193 165 if data != data or (data == 0.0 and data == 1.0): 194 value = u'.nan'166 value = '.nan' 195 167 elif data == self.inf_value: 196 value = u'.inf'168 value = '.inf' 197 169 elif data == -self.inf_value: 198 value = u'-.inf'199 else: 200 value = unicode(repr(data)).lower()170 value = '-.inf' 171 else: 172 value = repr(data).lower() 201 173 # Note that in some cases `repr(data)` represents a float number 202 174 # without the decimal parts. For instance: … … 206 178 # to the definition of the `!!float` tag. We fix this by adding 207 179 # '.0' before the 'e' symbol. 208 if u'.' not in value and u'e' in value:209 value = value.replace( u'e', u'.0e', 1)210 return self.represent_scalar( u'tag:yaml.org,2002:float', value)180 if '.' not in value and 'e' in value: 181 value = value.replace('e', '.0e', 1) 182 return self.represent_scalar('tag:yaml.org,2002:float', value) 211 183 212 184 def represent_list(self, data): … … 218 190 # break 219 191 #if not pairs: 220 return self.represent_sequence( u'tag:yaml.org,2002:seq', data)192 return self.represent_sequence('tag:yaml.org,2002:seq', data) 221 193 #value = [] 222 194 #for item_key, item_value in data: … … 226 198 227 199 def represent_dict(self, data): 228 return self.represent_mapping( u'tag:yaml.org,2002:map', data)200 return self.represent_mapping('tag:yaml.org,2002:map', data) 229 201 230 202 def represent_set(self, data): … … 232 204 for key in data: 233 205 value[key] = None 234 return self.represent_mapping( u'tag:yaml.org,2002:set', value)206 return self.represent_mapping('tag:yaml.org,2002:set', value) 235 207 236 208 def represent_date(self, data): 237 value = unicode(data.isoformat())238 return self.represent_scalar( u'tag:yaml.org,2002:timestamp', value)209 value = data.isoformat() 210 return self.represent_scalar('tag:yaml.org,2002:timestamp', value) 239 211 240 212 def represent_datetime(self, data): 241 value = unicode(data.isoformat(' '))242 return self.represent_scalar( u'tag:yaml.org,2002:timestamp', value)213 value = data.isoformat(' ') 214 return self.represent_scalar('tag:yaml.org,2002:timestamp', value) 243 215 244 216 def represent_yaml_object(self, tag, data, cls, flow_style=None): … … 258 230 SafeRepresenter.represent_str) 259 231 260 SafeRepresenter.add_representer( unicode,261 SafeRepresenter.represent_ unicode)232 SafeRepresenter.add_representer(bytes, 233 SafeRepresenter.represent_binary) 262 234 263 235 SafeRepresenter.add_representer(bool, … … 267 239 SafeRepresenter.represent_int) 268 240 269 SafeRepresenter.add_representer(long,270 SafeRepresenter.represent_long)271 272 241 SafeRepresenter.add_representer(float, 273 242 SafeRepresenter.represent_float) … … 287 256 SafeRepresenter.add_representer(datetime.date, 288 257 SafeRepresenter.represent_date) 258 289 259 SafeRepresenter.add_representer(datetime.datetime, 290 260 SafeRepresenter.represent_datetime) … … 295 265 class Representer(SafeRepresenter): 296 266 297 def represent_str(self, data):298 tag = None299 style = None300 try:301 data = unicode(data, 'ascii')302 tag = u'tag:yaml.org,2002:str'303 except UnicodeDecodeError:304 try:305 data = unicode(data, 'utf-8')306 tag = u'tag:yaml.org,2002:python/str'307 except UnicodeDecodeError:308 data = data.encode('base64')309 tag = u'tag:yaml.org,2002:binary'310 style = '|'311 return self.represent_scalar(tag, data, style=style)312 313 def represent_unicode(self, data):314 tag = None315 try:316 data.encode('ascii')317 tag = u'tag:yaml.org,2002:python/unicode'318 except UnicodeEncodeError:319 tag = u'tag:yaml.org,2002:str'320 return self.represent_scalar(tag, data)321 322 def represent_long(self, data):323 tag = u'tag:yaml.org,2002:int'324 if int(data) is not data:325 tag = u'tag:yaml.org,2002:python/long'326 return self.represent_scalar(tag, unicode(data))327 328 267 def represent_complex(self, data): 329 268 if data.imag == 0.0: 330 data = u'%r' % data.real269 data = '%r' % data.real 331 270 elif data.real == 0.0: 332 data = u'%rj' % data.imag271 data = '%rj' % data.imag 333 272 elif data.imag > 0: 334 data = u'%r+%rj' % (data.real, data.imag)335 else: 336 data = u'%r%rj' % (data.real, data.imag)337 return self.represent_scalar( u'tag:yaml.org,2002:python/complex', data)273 data = '%r+%rj' % (data.real, data.imag) 274 else: 275 data = '%r%rj' % (data.real, data.imag) 276 return self.represent_scalar('tag:yaml.org,2002:python/complex', data) 338 277 339 278 def represent_tuple(self, data): 340 return self.represent_sequence( u'tag:yaml.org,2002:python/tuple', data)279 return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) 341 280 342 281 def represent_name(self, data): 343 name = u'%s.%s' % (data.__module__, data.__name__)344 return self.represent_scalar( u'tag:yaml.org,2002:python/name:'+name, u'')282 name = '%s.%s' % (data.__module__, data.__name__) 283 return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') 345 284 346 285 def represent_module(self, data): 347 286 return self.represent_scalar( 348 u'tag:yaml.org,2002:python/module:'+data.__name__, u'') 349 350 def represent_instance(self, data): 351 # For instances of classic classes, we use __getinitargs__ and 352 # __getstate__ to serialize the data. 353 354 # If data.__getinitargs__ exists, the object must be reconstructed by 355 # calling cls(**args), where args is a tuple returned by 356 # __getinitargs__. Otherwise, the cls.__init__ method should never be 357 # called and the class instance is created by instantiating a trivial 358 # class and assigning to the instance's __class__ variable. 359 360 # If data.__getstate__ exists, it returns the state of the object. 361 # Otherwise, the state of the object is data.__dict__. 362 363 # We produce either a !!python/object or !!python/object/new node. 364 # If data.__getinitargs__ does not exist and state is a dictionary, we 365 # produce a !!python/object node . Otherwise we produce a 366 # !!python/object/new node. 367 368 cls = data.__class__ 369 class_name = u'%s.%s' % (cls.__module__, cls.__name__) 370 args = None 371 state = None 372 if hasattr(data, '__getinitargs__'): 373 args = list(data.__getinitargs__()) 374 if hasattr(data, '__getstate__'): 375 state = data.__getstate__() 376 else: 377 state = data.__dict__ 378 if args is None and isinstance(state, dict): 379 return self.represent_mapping( 380 u'tag:yaml.org,2002:python/object:'+class_name, state) 381 if isinstance(state, dict) and not state: 382 return self.represent_sequence( 383 u'tag:yaml.org,2002:python/object/new:'+class_name, args) 384 value = {} 385 if args: 386 value['args'] = args 387 value['state'] = state 388 return self.represent_mapping( 389 u'tag:yaml.org,2002:python/object/new:'+class_name, value) 287 'tag:yaml.org,2002:python/module:'+data.__name__, '') 390 288 391 289 def represent_object(self, data): … … 407 305 408 306 cls = type(data) 409 if cls in copy _reg.dispatch_table:410 reduce = copy _reg.dispatch_table[cls](data)307 if cls in copyreg.dispatch_table: 308 reduce = copyreg.dispatch_table[cls](data) 411 309 elif hasattr(data, '__reduce_ex__'): 412 310 reduce = data.__reduce_ex__(2) … … 427 325 function = args[0] 428 326 args = args[1:] 429 tag = u'tag:yaml.org,2002:python/object/new:'327 tag = 'tag:yaml.org,2002:python/object/new:' 430 328 newobj = True 431 329 else: 432 tag = u'tag:yaml.org,2002:python/object/apply:'330 tag = 'tag:yaml.org,2002:python/object/apply:' 433 331 newobj = False 434 function_name = u'%s.%s' % (function.__module__, function.__name__)332 function_name = '%s.%s' % (function.__module__, function.__name__) 435 333 if not args and not listitems and not dictitems \ 436 334 and isinstance(state, dict) and newobj: 437 335 return self.represent_mapping( 438 u'tag:yaml.org,2002:python/object:'+function_name, state)336 'tag:yaml.org,2002:python/object:'+function_name, state) 439 337 if not listitems and not dictitems \ 440 338 and isinstance(state, dict) and not state: … … 451 349 return self.represent_mapping(tag+function_name, value) 452 350 453 Representer.add_representer(str,454 Representer.represent_str)455 456 Representer.add_representer(unicode,457 Representer.represent_unicode)458 459 Representer.add_representer(long,460 Representer.represent_long)461 462 351 Representer.add_representer(complex, 463 352 Representer.represent_complex) … … 469 358 Representer.represent_name) 470 359 471 Representer.add_representer(types.ClassType,472 Representer.represent_name)473 474 360 Representer.add_representer(types.FunctionType, 475 361 Representer.represent_name) … … 481 367 Representer.represent_module) 482 368 483 Representer.add_multi_representer(types.InstanceType,484 Representer.represent_instance)485 486 369 Representer.add_multi_representer(object, 487 370 Representer.represent_object)
Note: See TracChangeset
for help on using the changeset viewer.
