同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# Author: Fred L. Drake, Jr.# fdrake@acm.org## This is a simple little module I wrote to make life easier. I didn't# see anything quite like it in the library, though I may have overlooked# something. I wrote this when I was trying to read some heavily nested# tuples with fairly non-descriptive content. This is modeled very much# after Lisp/Scheme - style pretty-printing of lists. If you find it# useful, thank small children who sleep at night."""Support to pretty-print lists, tuples, & dictionaries recursively.Very simple, but useful, especially in debugging data structures.Classes-------PrettyPrinter()Handle pretty-printing operations onto a stream using a configuredset of formatting parameters.Functions---------pformat()Format a Python object into a pretty-printed representation.pprint()Pretty-print a Python object to a stream [default is sys.stdout].saferepr()Generate a 'standard' repr()-like value, but protect against recursivedata structures."""import collections as _collectionsimport reimport sys as _sysimport types as _typesfrom io import StringIO as _StringIO__all__ = ["pprint","pformat","isreadable","isrecursive","saferepr","PrettyPrinter", "pp"]def pprint(object, stream=None, indent=1, width=80, depth=None, *,compact=False, sort_dicts=True):"""Pretty-print a Python object to a stream [default is sys.stdout]."""printer = PrettyPrinter(stream=stream, indent=indent, width=width, depth=depth,compact=compact, sort_dicts=sort_dicts)printer.pprint(object)def pformat(object, indent=1, width=80, depth=None, *,compact=False, sort_dicts=True):"""Format a Python object into a pretty-printed representation."""return PrettyPrinter(indent=indent, width=width, depth=depth,compact=compact, sort_dicts=sort_dicts).pformat(object)def pp(object, *args, sort_dicts=False, **kwargs):"""Pretty-print a Python object"""pprint(object, *args, sort_dicts=sort_dicts, **kwargs)def saferepr(object):"""Version of repr() which can handle recursive data structures."""return _safe_repr(object, {}, None, 0, True)[0]def isreadable(object):"""Determine if saferepr(object) is readable by eval()."""return _safe_repr(object, {}, None, 0, True)[1]def isrecursive(object):"""Determine if object requires a recursive representation."""return _safe_repr(object, {}, None, 0, True)[2]class _safe_key:"""Helper function for key functions when sorting unorderable objects.The wrapped-object will fallback to a Py2.x style comparison forunorderable types (sorting first comparing the type name and then bythe obj ids). Does not work recursively, so dict.items() must have_safe_key applied to both the key and the value."""__slots__ = ['obj']def __init__(self, obj):self.obj = objdef __lt__(self, other):try:return self.obj < other.objexcept TypeError:return ((str(type(self.obj)), id(self.obj)) < \(str(type(other.obj)), id(other.obj)))def _safe_tuple(t):"Helper function for comparing 2-tuples"return _safe_key(t[0]), _safe_key(t[1])class PrettyPrinter:def __init__(self, indent=1, width=80, depth=None, stream=None, *,compact=False, sort_dicts=True):"""Handle pretty printing operations onto a stream using a set ofconfigured parameters.indentNumber of spaces to indent for each level of nesting.widthAttempted maximum number of columns in the output.depthThe maximum depth to print out nested structures.streamThe desired output stream. If omitted (or false), the standardoutput stream available at construction will be used.compactIf true, several items will be combined in one line.sort_dictsIf true, dict keys are sorted."""indent = int(indent)width = int(width)if indent < 0:raise ValueError('indent must be >= 0')if depth is not None and depth <= 0:raise ValueError('depth must be > 0')if not width:raise ValueError('width must be != 0')self._depth = depthself._indent_per_level = indentself._width = widthif stream is not None:self._stream = streamelse:self._stream = _sys.stdoutself._compact = bool(compact)self._sort_dicts = sort_dictsdef pprint(self, object):self._format(object, self._stream, 0, 0, {}, 0)self._stream.write("\n")def pformat(self, object):sio = _StringIO()self._format(object, sio, 0, 0, {}, 0)return sio.getvalue()def isrecursive(self, object):return self.format(object, {}, 0, 0)[2]def isreadable(self, object):s, readable, recursive = self.format(object, {}, 0, 0)return readable and not recursivedef _format(self, object, stream, indent, allowance, context, level):objid = id(object)if objid in context:stream.write(_recursion(object))self._recursive = Trueself._readable = Falsereturnrep = self._repr(object, context, level)max_width = self._width - indent - allowanceif len(rep) > max_width:p = self._dispatch.get(type(object).__repr__, None)if p is not None:context[objid] = 1p(self, object, stream, indent, allowance, context, level + 1)del context[objid]returnelif isinstance(object, dict):context[objid] = 1self._pprint_dict(object, stream, indent, allowance,context, level + 1)del context[objid]returnstream.write(rep)_dispatch = {}def _pprint_dict(self, object, stream, indent, allowance, context, level):write = stream.writewrite('{')if self._indent_per_level > 1:write((self._indent_per_level - 1) * ' ')length = len(object)if length:if self._sort_dicts:items = sorted(object.items(), key=_safe_tuple)else:items = object.items()self._format_dict_items(items, stream, indent, allowance + 1,context, level)write('}')_dispatch[dict.__repr__] = _pprint_dictdef _pprint_ordered_dict(self, object, stream, indent, allowance, context, level):if not len(object):stream.write(repr(object))returncls = object.__class__stream.write(cls.__name__ + '(')self._format(list(object.items()), stream,indent + len(cls.__name__) + 1, allowance + 1,context, level)stream.write(')')_dispatch[_collections.OrderedDict.__repr__] = _pprint_ordered_dictdef _pprint_list(self, object, stream, indent, allowance, context, level):stream.write('[')self._format_items(object, stream, indent, allowance + 1,context, level)stream.write(']')_dispatch[list.__repr__] = _pprint_listdef _pprint_tuple(self, object, stream, indent, allowance, context, level):stream.write('(')endchar = ',)' if len(object) == 1 else ')'self._format_items(object, stream, indent, allowance + len(endchar),context, level)stream.write(endchar)_dispatch[tuple.__repr__] = _pprint_tupledef _pprint_set(self, object, stream, indent, allowance, context, level):if not len(object):stream.write(repr(object))returntyp = object.__class__if typ is set:stream.write('{')endchar = '}'else:stream.write(typ.__name__ + '({')endchar = '})'indent += len(typ.__name__) + 1object = sorted(object, key=_safe_key)self._format_items(object, stream, indent, allowance + len(endchar),context, level)stream.write(endchar)_dispatch[set.__repr__] = _pprint_set_dispatch[frozenset.__repr__] = _pprint_setdef _pprint_str(self, object, stream, indent, allowance, context, level):write = stream.writeif not len(object):write(repr(object))returnchunks = []lines = object.splitlines(True)if level == 1:indent += 1allowance += 1max_width1 = max_width = self._width - indentfor i, line in enumerate(lines):rep = repr(line)if i == len(lines) - 1:max_width1 -= allowanceif len(rep) <= max_width1:chunks.append(rep)else:# A list of alternating (non-space, space) stringsparts = re.findall(r'\S*\s*', line)assert partsassert not parts[-1]parts.pop() # drop empty last partmax_width2 = max_widthcurrent = ''for j, part in enumerate(parts):candidate = current + partif j == len(parts) - 1 and i == len(lines) - 1:max_width2 -= allowanceif len(repr(candidate)) > max_width2:if current:chunks.append(repr(current))current = partelse:current = candidateif current:chunks.append(repr(current))if len(chunks) == 1:write(rep)returnif level == 1:write('(')for i, rep in enumerate(chunks):if i > 0:write('\n' + ' '*indent)write(rep)if level == 1:write(')')_dispatch[str.__repr__] = _pprint_strdef _pprint_bytes(self, object, stream, indent, allowance, context, level):write = stream.writeif len(object) <= 4:write(repr(object))returnparens = level == 1if parens:indent += 1allowance += 1write('(')delim = ''for rep in _wrap_bytes_repr(object, self._width - indent, allowance):write(delim)write(rep)if not delim:delim = '\n' + ' '*indentif parens:write(')')_dispatch[bytes.__repr__] = _pprint_bytesdef _pprint_bytearray(self, object, stream, indent, allowance, context, level):write = stream.writewrite('bytearray(')self._pprint_bytes(bytes(object), stream, indent + 10,allowance + 1, context, level + 1)write(')')_dispatch[bytearray.__repr__] = _pprint_bytearraydef _pprint_mappingproxy(self, object, stream, indent, allowance, context, level):stream.write('mappingproxy(')self._format(object.copy(), stream, indent + 13, allowance + 1,context, level)stream.write(')')_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxydef _format_dict_items(self, items, stream, indent, allowance, context,level):write = stream.writeindent += self._indent_per_leveldelimnl = ',\n' + ' ' * indentlast_index = len(items) - 1for i, (key, ent) in enumerate(items):last = i == last_indexrep = self._repr(key, context, level)write(rep)write(': ')self._format(ent, stream, indent + len(rep) + 2,allowance if last else 1,context, level)if not last:write(delimnl)def _format_items(self, items, stream, indent, allowance, context, level):write = stream.writeindent += self._indent_per_levelif self._indent_per_level > 1:write((self._indent_per_level - 1) * ' ')delimnl = ',\n' + ' ' * indentdelim = ''width = max_width = self._width - indent + 1it = iter(items)try:next_ent = next(it)except StopIteration:returnlast = Falsewhile not last:ent = next_enttry:next_ent = next(it)except StopIteration:last = Truemax_width -= allowancewidth -= allowanceif self._compact:rep = self._repr(ent, context, level)w = len(rep) + 2if width < w:width = max_widthif delim:delim = delimnlif width >= w:width -= wwrite(delim)delim = ', 'write(rep)continuewrite(delim)delim = delimnlself._format(ent, stream, indent,allowance if last else 1,context, level)def _repr(self, object, context, level):repr, readable, recursive = self.format(object, context.copy(),self._depth, level)if not readable:self._readable = Falseif recursive:self._recursive = Truereturn reprdef format(self, object, context, maxlevels, level):"""Format object for a specific context, returning a stringand flags indicating whether the representation is 'readable'and whether the object represents a recursive construct."""return _safe_repr(object, context, maxlevels, level, self._sort_dicts)def _pprint_default_dict(self, object, stream, indent, allowance, context, level):if not len(object):stream.write(repr(object))returnrdf = self._repr(object.default_factory, context, level)cls = object.__class__indent += len(cls.__name__) + 1stream.write('%s(%s,\n%s' % (cls.__name__, rdf, ' ' * indent))self._pprint_dict(object, stream, indent, allowance + 1, context, level)stream.write(')')_dispatch[_collections.defaultdict.__repr__] = _pprint_default_dictdef _pprint_counter(self, object, stream, indent, allowance, context, level):if not len(object):stream.write(repr(object))returncls = object.__class__stream.write(cls.__name__ + '({')if self._indent_per_level > 1:stream.write((self._indent_per_level - 1) * ' ')items = object.most_common()self._format_dict_items(items, stream,indent + len(cls.__name__) + 1, allowance + 2,context, level)stream.write('})')_dispatch[_collections.Counter.__repr__] = _pprint_counterdef _pprint_chain_map(self, object, stream, indent, allowance, context, level):if not len(object.maps):stream.write(repr(object))returncls = object.__class__stream.write(cls.__name__ + '(')indent += len(cls.__name__) + 1for i, m in enumerate(object.maps):if i == len(object.maps) - 1:self._format(m, stream, indent, allowance + 1, context, level)stream.write(')')else:self._format(m, stream, indent, 1, context, level)stream.write(',\n' + ' ' * indent)_dispatch[_collections.ChainMap.__repr__] = _pprint_chain_mapdef _pprint_deque(self, object, stream, indent, allowance, context, level):if not len(object):stream.write(repr(object))returncls = object.__class__stream.write(cls.__name__ + '(')indent += len(cls.__name__) + 1stream.write('[')if object.maxlen is None:self._format_items(object, stream, indent, allowance + 2,context, level)stream.write('])')else:self._format_items(object, stream, indent, 2,context, level)rml = self._repr(object.maxlen, context, level)stream.write('],\n%smaxlen=%s)' % (' ' * indent, rml))_dispatch[_collections.deque.__repr__] = _pprint_dequedef _pprint_user_dict(self, object, stream, indent, allowance, context, level):self._format(object.data, stream, indent, allowance, context, level - 1)_dispatch[_collections.UserDict.__repr__] = _pprint_user_dictdef _pprint_user_list(self, object, stream, indent, allowance, context, level):self._format(object.data, stream, indent, allowance, context, level - 1)_dispatch[_collections.UserList.__repr__] = _pprint_user_listdef _pprint_user_string(self, object, stream, indent, allowance, context, level):self._format(object.data, stream, indent, allowance, context, level - 1)_dispatch[_collections.UserString.__repr__] = _pprint_user_string# Return triple (repr_string, isreadable, isrecursive).def _safe_repr(object, context, maxlevels, level, sort_dicts):typ = type(object)if typ in _builtin_scalars:return repr(object), True, Falser = getattr(typ, "__repr__", None)if issubclass(typ, dict) and r is dict.__repr__:if not object:return "{}", True, Falseobjid = id(object)if maxlevels and level >= maxlevels:return "{...}", False, objid in contextif objid in context:return _recursion(object), False, Truecontext[objid] = 1readable = Truerecursive = Falsecomponents = []append = components.appendlevel += 1if sort_dicts:items = sorted(object.items(), key=_safe_tuple)else:items = object.items()for k, v in items:krepr, kreadable, krecur = _safe_repr(k, context, maxlevels, level, sort_dicts)vrepr, vreadable, vrecur = _safe_repr(v, context, maxlevels, level, sort_dicts)append("%s: %s" % (krepr, vrepr))readable = readable and kreadable and vreadableif krecur or vrecur:recursive = Truedel context[objid]return "{%s}" % ", ".join(components), readable, recursiveif (issubclass(typ, list) and r is list.__repr__) or \(issubclass(typ, tuple) and r is tuple.__repr__):if issubclass(typ, list):if not object:return "[]", True, Falseformat = "[%s]"elif len(object) == 1:format = "(%s,)"else:if not object:return "()", True, Falseformat = "(%s)"objid = id(object)if maxlevels and level >= maxlevels:return format % "...", False, objid in contextif objid in context:return _recursion(object), False, Truecontext[objid] = 1readable = Truerecursive = Falsecomponents = []append = components.appendlevel += 1for o in object:orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level, sort_dicts)append(orepr)if not oreadable:readable = Falseif orecur:recursive = Truedel context[objid]return format % ", ".join(components), readable, recursiverep = repr(object)return rep, (rep and not rep.startswith('<')), False_builtin_scalars = frozenset({str, bytes, bytearray, int, float, complex,bool, type(None)})def _recursion(object):return ("<Recursion on %s with id=%s>"% (type(object).__name__, id(object)))def _perfcheck(object=None):import timeif object is None:object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000p = PrettyPrinter()t1 = time.perf_counter()_safe_repr(object, {}, None, 0, True)t2 = time.perf_counter()p.pformat(object)t3 = time.perf_counter()print("_safe_repr:", t2 - t1)print("pformat:", t3 - t2)def _wrap_bytes_repr(object, width, allowance):current = b''last = len(object) // 4 * 4for i in range(0, len(object), 4):part = object[i: i+4]candidate = current + partif i == last:width -= allowanceif len(repr(candidate)) > width:if current:yield repr(current)current = partelse:current = candidateif current:yield repr(current)if __name__ == "__main__":_perfcheck()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。