NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

repr.py (7412B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\debug\repr.py
      2 import sys
      3 import re
      4 from traceback import format_exception_only
      5 try:
      6     from collections import deque
      7 except ImportError:
      8     deque = None
      9 
     10 from werkzeug.utils import escape
     11 from werkzeug.debug.utils import render_template
     12 missing = object()
     13 _paragraph_re = re.compile('(?:\\r\\n|\\r|\\n){2,}')
     14 RegexType = type(_paragraph_re)
     15 
     16 def debug_repr(obj):
     17     return DebugReprGenerator().repr(obj)
     18 
     19 
     20 def dump(obj = missing):
     21     gen = DebugReprGenerator()
     22     if obj is missing:
     23         rv = gen.dump_locals(sys._getframe(1).f_locals)
     24     else:
     25         rv = gen.dump_object(obj)
     26     sys.stdout._write(rv)
     27 
     28 
     29 class _Helper(object):
     30 
     31     def __call__(self, topic = None):
     32         title = text = None
     33         if topic is not None:
     34             import pydoc
     35             pydoc.help(topic)
     36             rv = sys.stdout.reset().decode('utf-8', 'ignore')
     37             paragraphs = _paragraph_re.split(rv)
     38             if len(paragraphs) > 1:
     39                 title = paragraphs[0]
     40                 text = '\n\n'.join(paragraphs[1:])
     41             else:
     42                 title = 'Help'
     43                 text = paragraphs[0]
     44         rv = render_template('help_command.html', title=title, text=text)
     45         sys.stdout._write(rv)
     46 
     47 
     48 helper = _Helper()
     49 
     50 def _add_subclass_info(inner, obj, base):
     51     if isinstance(base, tuple):
     52         for base in base:
     53             if type(obj) is base:
     54                 return inner
     55 
     56     elif type(obj) is base:
     57         return inner
     58     module = ''
     59     if obj.__class__.__module__ not in ('__builtin__', 'exceptions'):
     60         module = '<span class="module">%s.</span>' % obj.__class__.__module__
     61     return '%s%s(%s)' % (module, obj.__class__.__name__, inner)
     62 
     63 
     64 class DebugReprGenerator(object):
     65 
     66     def __init__(self):
     67         self._stack = []
     68 
     69     def _sequence_repr_maker(left, right, base = object(), limit = 8):
     70 
     71         def proxy(self, obj, recursive):
     72             if recursive:
     73                 return _add_subclass_info(left + '...' + right, obj, base)
     74             buf = [left]
     75             have_extended_section = False
     76             for idx, item in enumerate(obj):
     77                 if idx:
     78                     buf.append(', ')
     79                 if idx == limit:
     80                     buf.append('<span class="extended">')
     81                     have_extended_section = True
     82                 buf.append(self.repr(item))
     83 
     84             if have_extended_section:
     85                 buf.append('</span>')
     86             buf.append(right)
     87             return _add_subclass_info(u''.join(buf), obj, base)
     88 
     89         return proxy
     90 
     91     list_repr = _sequence_repr_maker('[', ']', list)
     92     tuple_repr = _sequence_repr_maker('(', ')', tuple)
     93     set_repr = _sequence_repr_maker('set([', '])', set)
     94     frozenset_repr = _sequence_repr_maker('frozenset([', '])', frozenset)
     95     if deque is not None:
     96         deque_repr = _sequence_repr_maker('<span class="module">collections.</span>deque([', '])', deque)
     97     del _sequence_repr_maker
     98 
     99     def regex_repr(self, obj):
    100         pattern = repr(obj.pattern).decode('string-escape', 'ignore')
    101         if pattern[:1] == 'u':
    102             pattern = 'ur' + pattern[1:]
    103         else:
    104             pattern = 'r' + pattern
    105         return u're.compile(<span class="string regex">%s</span>)' % pattern
    106 
    107     def string_repr(self, obj, limit = 70):
    108         buf = ['<span class="string">']
    109         escaped = escape(obj)
    110         a = repr(escaped[:limit])
    111         b = repr(escaped[limit:])
    112         if isinstance(obj, unicode):
    113             buf.append('u')
    114             a = a[1:]
    115             b = b[1:]
    116         if b != "''":
    117             buf.extend((a[:-1],
    118              '<span class="extended">',
    119              b[1:],
    120              '</span>'))
    121         else:
    122             buf.append(a)
    123         buf.append('</span>')
    124         return _add_subclass_info(u''.join(buf), obj, (str, unicode))
    125 
    126     def dict_repr(self, d, recursive, limit = 5):
    127         if recursive:
    128             return _add_subclass_info(u'{...}', d, dict)
    129         buf = ['{']
    130         have_extended_section = False
    131         for idx, (key, value) in enumerate(d.iteritems()):
    132             if idx:
    133                 buf.append(', ')
    134             if idx == limit - 1:
    135                 buf.append('<span class="extended">')
    136                 have_extended_section = True
    137             buf.append('<span class="pair"><span class="key">%s</span>: <span class="value">%s</span></span>' % (self.repr(key), self.repr(value)))
    138 
    139         if have_extended_section:
    140             buf.append('</span>')
    141         buf.append('}')
    142         return _add_subclass_info(u''.join(buf), d, dict)
    143 
    144     def object_repr(self, obj):
    145         return u'<span class="object">%s</span>' % escape(repr(obj).decode('utf-8', 'replace'))
    146 
    147     def dispatch_repr(self, obj, recursive):
    148         if obj is helper:
    149             return helper.get_help(None)
    150         if isinstance(obj, (int,
    151          long,
    152          float,
    153          complex)):
    154             return u'<span class="number">%r</span>' % obj
    155         if isinstance(obj, basestring):
    156             return self.string_repr(obj)
    157         if isinstance(obj, RegexType):
    158             return self.regex_repr(obj)
    159         if isinstance(obj, list):
    160             return self.list_repr(obj, recursive)
    161         if isinstance(obj, tuple):
    162             return self.tuple_repr(obj, recursive)
    163         if isinstance(obj, set):
    164             return self.set_repr(obj, recursive)
    165         if isinstance(obj, frozenset):
    166             return self.frozenset_repr(obj, recursive)
    167         if isinstance(obj, dict):
    168             return self.dict_repr(obj, recursive)
    169         if deque is not None and isinstance(obj, deque):
    170             return self.deque_repr(obj, recursive)
    171         return self.object_repr(obj)
    172 
    173     def fallback_repr(self):
    174         try:
    175             info = ''.join(format_exception_only(*sys.exc_info()[:2]))
    176         except:
    177             info = '?'
    178 
    179         return u'<span class="brokenrepr">&lt;broken repr (%s)&gt;</span>' % escape(info.decode('utf-8', 'ignore').strip())
    180 
    181     def repr(self, obj):
    182         recursive = False
    183         for item in self._stack:
    184             if item is obj:
    185                 recursive = True
    186                 break
    187 
    188         self._stack.append(obj)
    189         try:
    190             return self.dispatch_repr(obj, recursive)
    191         except:
    192             return self.fallback_repr()
    193         finally:
    194             self._stack.pop()
    195 
    196     def dump_object(self, obj):
    197         repr = items = None
    198         if isinstance(obj, dict):
    199             title = 'Contents of'
    200             items = []
    201             for key, value in obj.iteritems():
    202                 if not isinstance(key, basestring):
    203                     items = None
    204                     break
    205                 items.append((key, self.repr(value)))
    206 
    207         if items is None:
    208             items = []
    209             repr = self.repr(obj)
    210             for key in dir(obj):
    211                 try:
    212                     items.append((key, self.repr(getattr(obj, key))))
    213                 except:
    214                     pass
    215 
    216             title = 'Details for'
    217         title += ' ' + object.__repr__(obj)[1:-1]
    218         return render_template('dump_object.html', items=items, title=title, repr=repr)
    219 
    220     def dump_locals(self, d):
    221         items = [ (key, self.repr(value)) for key, value in d.items() ]
    222         return render_template('dump_object.html', items=items, title='Local variables in frame', repr=None)