Ignore:
Timestamp:
12/29/08 12:24:05 (6 years ago)
Author:
xi
Message:

Added basic support for Python 3 (Thanks idadesub(at)users(dot)sourceforge(dot)net).

Location:
pyyaml/trunk/lib3
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • pyyaml/trunk/lib3/yaml/constructor.py

    r303 r328  
    33    'ConstructorError'] 
    44 
    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 binascii, re, sys, types 
     5from .error import * 
     6from .nodes import * 
     7 
     8import collections, datetime, base64, binascii, re, sys, types 
    169 
    1710class ConstructorError(MarkedYAMLError): 
    1811    pass 
    1912 
    20 class BaseConstructor(object): 
     13class BaseConstructor: 
    2114 
    2215    yaml_constructors = {} 
     
    9689        if isinstance(data, types.GeneratorType): 
    9790            generator = data 
    98             data = generator.next() 
     91            data = next(generator) 
    9992            if self.deep_construct: 
    10093                for dummy in generator: 
     
    131124        for key_node, value_node in node.value: 
    132125            key = self.construct_object(key_node, deep=deep) 
    133             try: 
    134                 hash(key) 
    135             except TypeError, exc: 
     126            if not isinstance(key, collections.Hashable): 
    136127                raise ConstructorError("while constructing a mapping", node.start_mark, 
    137                         "found unacceptable key (%s)" % exc, key_node.start_mark) 
     128                        "found unhashable key", key_node.start_mark) 
    138129            value = self.construct_object(value_node, deep=deep) 
    139130            mapping[key] = value 
     
    152143        return pairs 
    153144 
     145    @classmethod 
    154146    def add_constructor(cls, tag, constructor): 
    155147        if not 'yaml_constructors' in cls.__dict__: 
    156148            cls.yaml_constructors = cls.yaml_constructors.copy() 
    157149        cls.yaml_constructors[tag] = constructor 
    158     add_constructor = classmethod(add_constructor) 
    159  
     150 
     151    @classmethod 
    160152    def add_multi_constructor(cls, tag_prefix, multi_constructor): 
    161153        if not 'yaml_multi_constructors' in cls.__dict__: 
    162154            cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() 
    163155        cls.yaml_multi_constructors[tag_prefix] = multi_constructor 
    164     add_multi_constructor = classmethod(add_multi_constructor) 
    165156 
    166157class SafeConstructor(BaseConstructor): 
     
    169160        if isinstance(node, MappingNode): 
    170161            for key_node, value_node in node.value: 
    171                 if key_node.tag == u'tag:yaml.org,2002:value': 
     162                if key_node.tag == 'tag:yaml.org,2002:value': 
    172163                    return self.construct_scalar(value_node) 
    173         return BaseConstructor.construct_scalar(self, node) 
     164        return super().construct_scalar(node) 
    174165 
    175166    def flatten_mapping(self, node): 
     
    178169        while index < len(node.value): 
    179170            key_node, value_node = node.value[index] 
    180             if key_node.tag == u'tag:yaml.org,2002:merge': 
     171            if key_node.tag == 'tag:yaml.org,2002:merge': 
    181172                del node.value[index] 
    182173                if isinstance(value_node, MappingNode): 
     
    200191                            "expected a mapping or list of mappings for merging, but found %s" 
    201192                            % value_node.id, value_node.start_mark) 
    202             elif key_node.tag == u'tag:yaml.org,2002:value': 
    203                 key_node.tag = u'tag:yaml.org,2002:str' 
     193            elif key_node.tag == 'tag:yaml.org,2002:value': 
     194                key_node.tag = 'tag:yaml.org,2002:str' 
    204195                index += 1 
    205196            else: 
     
    211202        if isinstance(node, MappingNode): 
    212203            self.flatten_mapping(node) 
    213         return BaseConstructor.construct_mapping(self, node, deep=deep) 
     204        return super().construct_mapping(node, deep=deep) 
    214205 
    215206    def construct_yaml_null(self, node): 
     
    218209 
    219210    bool_values = { 
    220         u'yes':     True, 
    221         u'no':      False, 
    222         u'true':    True, 
    223         u'false':   False, 
    224         u'on':      True, 
    225         u'off':     False, 
     211        'yes':      True, 
     212        'no':       False, 
     213        'true':     True, 
     214        'false':    False, 
     215        'on':       True, 
     216        'off':      False, 
    226217    } 
    227218 
     
    231222 
    232223    def construct_yaml_int(self, node): 
    233         value = str(self.construct_scalar(node)) 
     224        value = self.construct_scalar(node) 
    234225        value = value.replace('_', '') 
    235226        sign = +1 
     
    264255 
    265256    def construct_yaml_float(self, node): 
    266         value = str(self.construct_scalar(node)) 
     257        value = self.construct_scalar(node) 
    267258        value = value.replace('_', '').lower() 
    268259        sign = +1 
     
    288279 
    289280    def construct_yaml_binary(self, node): 
    290         value = self.construct_scalar(node) 
    291281        try: 
    292             return str(value).decode('base64') 
    293         except (binascii.Error, UnicodeEncodeError), exc: 
    294             raise ConstructorError(None, None, 
    295                     "failed to decode base64 data: %s" % exc, node.start_mark)  
     282            value = self.construct_scalar(node).encode('ascii') 
     283        except UnicodeEncodeError as exc: 
     284            raise ConstructorError(None, None, 
     285                    "failed to convert base64 data into ascii: %s" % exc, 
     286                    node.start_mark) 
     287        try: 
     288            return base64.decodestring(value) 
     289        except binascii.Error as exc: 
     290            raise ConstructorError(None, None, 
     291                    "failed to decode base64 data: %s" % exc, node.start_mark) 
    296292 
    297293    timestamp_regexp = re.compile( 
    298             ur'''^(?P<year>[0-9][0-9][0-9][0-9]) 
     294            r'''^(?P<year>[0-9][0-9][0-9][0-9]) 
    299295                -(?P<month>[0-9][0-9]?) 
    300296                -(?P<day>[0-9][0-9]?) 
     
    387383 
    388384    def construct_yaml_str(self, node): 
    389         value = self.construct_scalar(node) 
    390         try: 
    391             return value.encode('ascii') 
    392         except UnicodeEncodeError: 
    393             return value 
     385        return self.construct_scalar(node) 
    394386 
    395387    def construct_yaml_seq(self, node): 
     
    416408    def construct_undefined(self, node): 
    417409        raise ConstructorError(None, None, 
    418                 "could not determine a constructor for the tag %r" % node.tag.encode('utf-8'), 
     410                "could not determine a constructor for the tag %r" % node.tag, 
    419411                node.start_mark) 
    420412 
    421413SafeConstructor.add_constructor( 
    422         u'tag:yaml.org,2002:null', 
     414        'tag:yaml.org,2002:null', 
    423415        SafeConstructor.construct_yaml_null) 
    424416 
    425417SafeConstructor.add_constructor( 
    426         u'tag:yaml.org,2002:bool', 
     418        'tag:yaml.org,2002:bool', 
    427419        SafeConstructor.construct_yaml_bool) 
    428420 
    429421SafeConstructor.add_constructor( 
    430         u'tag:yaml.org,2002:int', 
     422        'tag:yaml.org,2002:int', 
    431423        SafeConstructor.construct_yaml_int) 
    432424 
    433425SafeConstructor.add_constructor( 
    434         u'tag:yaml.org,2002:float', 
     426        'tag:yaml.org,2002:float', 
    435427        SafeConstructor.construct_yaml_float) 
    436428 
    437429SafeConstructor.add_constructor( 
    438         u'tag:yaml.org,2002:binary', 
     430        'tag:yaml.org,2002:binary', 
    439431        SafeConstructor.construct_yaml_binary) 
    440432 
    441433SafeConstructor.add_constructor( 
    442         u'tag:yaml.org,2002:timestamp', 
     434        'tag:yaml.org,2002:timestamp', 
    443435        SafeConstructor.construct_yaml_timestamp) 
    444436 
    445437SafeConstructor.add_constructor( 
    446         u'tag:yaml.org,2002:omap', 
     438        'tag:yaml.org,2002:omap', 
    447439        SafeConstructor.construct_yaml_omap) 
    448440 
    449441SafeConstructor.add_constructor( 
    450         u'tag:yaml.org,2002:pairs', 
     442        'tag:yaml.org,2002:pairs', 
    451443        SafeConstructor.construct_yaml_pairs) 
    452444 
    453445SafeConstructor.add_constructor( 
    454         u'tag:yaml.org,2002:set', 
     446        'tag:yaml.org,2002:set', 
    455447        SafeConstructor.construct_yaml_set) 
    456448 
    457449SafeConstructor.add_constructor( 
    458         u'tag:yaml.org,2002:str', 
     450        'tag:yaml.org,2002:str', 
    459451        SafeConstructor.construct_yaml_str) 
    460452 
    461453SafeConstructor.add_constructor( 
    462         u'tag:yaml.org,2002:seq', 
     454        'tag:yaml.org,2002:seq', 
    463455        SafeConstructor.construct_yaml_seq) 
    464456 
    465457SafeConstructor.add_constructor( 
    466         u'tag:yaml.org,2002:map', 
     458        'tag:yaml.org,2002:map', 
    467459        SafeConstructor.construct_yaml_map) 
    468460 
     
    473465 
    474466    def construct_python_str(self, node): 
    475         return self.construct_scalar(node).encode('utf-8') 
     467        return self.construct_scalar(node) 
    476468 
    477469    def construct_python_unicode(self, node): 
    478470        return self.construct_scalar(node) 
    479471 
     472    def construct_python_bytes(self, node): 
     473        try: 
     474            value = self.construct_scalar(node).encode('ascii') 
     475        except UnicodeEncodeError as exc: 
     476            raise ConstructorError(None, None, 
     477                    "failed to convert base64 data into ascii: %s" % exc, 
     478                    node.start_mark) 
     479        try: 
     480            return base64.decodestring(value) 
     481        except binascii.Error as exc: 
     482            raise ConstructorError(None, None, 
     483                    "failed to decode base64 data: %s" % exc, node.start_mark) 
     484 
    480485    def construct_python_long(self, node): 
    481         return long(self.construct_yaml_int(node)) 
     486        return self.construct_yaml_int(node) 
    482487 
    483488    def construct_python_complex(self, node): 
     
    493498        try: 
    494499            __import__(name) 
    495         except ImportError, exc: 
     500        except ImportError as exc: 
    496501            raise ConstructorError("while constructing a Python module", mark, 
    497                     "cannot find module %r (%s)" % (name.encode('utf-8'), exc), mark) 
     502                    "cannot find module %r (%s)" % (name, exc), mark) 
    498503        return sys.modules[name] 
    499504 
     
    502507            raise ConstructorError("while constructing a Python object", mark, 
    503508                    "expected non-empty name appended to the tag", mark) 
    504         if u'.' in name: 
    505             # Python 2.4 only 
    506             #module_name, object_name = name.rsplit('.', 1) 
    507             items = name.split('.') 
    508             object_name = items.pop() 
    509             module_name = '.'.join(items) 
     509        if '.' in name: 
     510            module_name, object_name = name.rsplit('.', 1) 
    510511        else: 
    511512            module_name = '__builtin__' 
     
    513514        try: 
    514515            __import__(module_name) 
    515         except ImportError, exc: 
     516        except ImportError as exc: 
    516517            raise ConstructorError("while constructing a Python object", mark, 
    517                     "cannot find module %r (%s)" % (module_name.encode('utf-8'), exc), mark) 
     518                    "cannot find module %r (%s)" % (module_name, exc), mark) 
    518519        module = sys.modules[module_name] 
    519520        if not hasattr(module, object_name): 
    520521            raise ConstructorError("while constructing a Python object", mark, 
    521                     "cannot find %r in the module %r" % (object_name.encode('utf-8'), 
    522                         module.__name__), mark) 
     522                    "cannot find %r in the module %r" 
     523                    % (object_name, module.__name__), mark) 
    523524        return getattr(module, object_name) 
    524525 
     
    527528        if value: 
    528529            raise ConstructorError("while constructing a Python name", node.start_mark, 
    529                     "expected the empty value, but found %r" % value.encode('utf-8'), 
    530                     node.start_mark) 
     530                    "expected the empty value, but found %r" % value, node.start_mark) 
    531531        return self.find_python_name(suffix, node.start_mark) 
    532532 
     
    535535        if value: 
    536536            raise ConstructorError("while constructing a Python module", node.start_mark, 
    537                     "expected the empty value, but found %r" % value.encode('utf-8'), 
    538                     node.start_mark) 
     537                    "expected the empty value, but found %r" % value, node.start_mark) 
    539538        return self.find_python_module(suffix, node.start_mark) 
    540  
    541     class classobj: pass 
    542539 
    543540    def make_python_instance(self, suffix, node, 
     
    548545            kwds = {} 
    549546        cls = self.find_python_name(suffix, node.start_mark) 
    550         if newobj and isinstance(cls, type(self.classobj))  \ 
    551                 and not args and not kwds: 
    552             instance = self.classobj() 
    553             instance.__class__ = cls 
    554             return instance 
    555         elif newobj and isinstance(cls, type): 
     547        if newobj and isinstance(cls, type): 
    556548            return cls.__new__(cls, *args, **kwds) 
    557549        else: 
     
    620612 
    621613Constructor.add_constructor( 
    622     u'tag:yaml.org,2002:python/none', 
     614    'tag:yaml.org,2002:python/none', 
    623615    Constructor.construct_yaml_null) 
    624616 
    625617Constructor.add_constructor( 
    626     u'tag:yaml.org,2002:python/bool', 
     618    'tag:yaml.org,2002:python/bool', 
    627619    Constructor.construct_yaml_bool) 
    628620 
    629621Constructor.add_constructor( 
    630     u'tag:yaml.org,2002:python/str', 
     622    'tag:yaml.org,2002:python/str', 
    631623    Constructor.construct_python_str) 
    632624 
    633625Constructor.add_constructor( 
    634     u'tag:yaml.org,2002:python/unicode', 
     626    'tag:yaml.org,2002:python/unicode', 
    635627    Constructor.construct_python_unicode) 
    636628 
    637629Constructor.add_constructor( 
    638     u'tag:yaml.org,2002:python/int', 
     630    'tag:yaml.org,2002:python/bytes', 
     631    Constructor.construct_python_bytes) 
     632 
     633Constructor.add_constructor( 
     634    'tag:yaml.org,2002:python/int', 
    639635    Constructor.construct_yaml_int) 
    640636 
    641637Constructor.add_constructor( 
    642     u'tag:yaml.org,2002:python/long', 
     638    'tag:yaml.org,2002:python/long', 
    643639    Constructor.construct_python_long) 
    644640 
    645641Constructor.add_constructor( 
    646     u'tag:yaml.org,2002:python/float', 
     642    'tag:yaml.org,2002:python/float', 
    647643    Constructor.construct_yaml_float) 
    648644 
    649645Constructor.add_constructor( 
    650     u'tag:yaml.org,2002:python/complex', 
     646    'tag:yaml.org,2002:python/complex', 
    651647    Constructor.construct_python_complex) 
    652648 
    653649Constructor.add_constructor( 
    654     u'tag:yaml.org,2002:python/list', 
     650    'tag:yaml.org,2002:python/list', 
    655651    Constructor.construct_yaml_seq) 
    656652 
    657653Constructor.add_constructor( 
    658     u'tag:yaml.org,2002:python/tuple', 
     654    'tag:yaml.org,2002:python/tuple', 
    659655    Constructor.construct_python_tuple) 
    660656 
    661657Constructor.add_constructor( 
    662     u'tag:yaml.org,2002:python/dict', 
     658    'tag:yaml.org,2002:python/dict', 
    663659    Constructor.construct_yaml_map) 
    664660 
    665661Constructor.add_multi_constructor( 
    666     u'tag:yaml.org,2002:python/name:', 
     662    'tag:yaml.org,2002:python/name:', 
    667663    Constructor.construct_python_name) 
    668664 
    669665Constructor.add_multi_constructor( 
    670     u'tag:yaml.org,2002:python/module:', 
     666    'tag:yaml.org,2002:python/module:', 
    671667    Constructor.construct_python_module) 
    672668 
    673669Constructor.add_multi_constructor( 
    674     u'tag:yaml.org,2002:python/object:', 
     670    'tag:yaml.org,2002:python/object:', 
    675671    Constructor.construct_python_object) 
    676672 
    677673Constructor.add_multi_constructor( 
    678     u'tag:yaml.org,2002:python/object/apply:', 
     674    'tag:yaml.org,2002:python/object/apply:', 
    679675    Constructor.construct_python_object_apply) 
    680676 
    681677Constructor.add_multi_constructor( 
    682     u'tag:yaml.org,2002:python/object/new:', 
     678    'tag:yaml.org,2002:python/object/new:', 
    683679    Constructor.construct_python_object_new) 
    684680 
Note: See TracChangeset for help on using the changeset viewer.