| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  | #  Author:      Fred L. Drake, Jr. | 
					
						
							| 
									
										
										
										
											2001-10-09 20:53:48 +00:00
										 |  |  | #               fdrake@acm.org | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | # | 
					
						
							|  |  |  | #  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 | 
					
						
							| 
									
										
										
										
											2000-07-16 12:04:32 +00:00
										 |  |  | #  tuples with fairly non-descriptive content.  This is modeled very much | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | #  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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | Classes | 
					
						
							|  |  |  | ------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PrettyPrinter() | 
					
						
							|  |  |  |     Handle pretty-printing operations onto a stream using a configured | 
					
						
							|  |  |  |     set of formatting parameters. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | Functions | 
					
						
							|  |  |  | --------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pformat() | 
					
						
							|  |  |  |     Format a Python object into a pretty-printed representation. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pprint() | 
					
						
							| 
									
										
										
										
											2004-05-14 16:31:56 +00:00
										 |  |  |     Pretty-print a Python object to a stream [default is sys.stdout]. | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | saferepr() | 
					
						
							|  |  |  |     Generate a 'standard' repr()-like value, but protect against recursive | 
					
						
							|  |  |  |     data structures. | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-26 08:51:33 +02:00
										 |  |  | import collections as _collections | 
					
						
							| 
									
										
										
										
											2013-03-23 20:30:39 +01:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2002-12-31 07:14:18 +00:00
										 |  |  | import sys as _sys | 
					
						
							| 
									
										
										
										
											2015-03-24 19:31:50 +02:00
										 |  |  | import types as _types | 
					
						
							| 
									
										
										
										
											2007-08-09 01:03:29 +00:00
										 |  |  | from io import StringIO as _StringIO | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-12 02:00:42 +00:00
										 |  |  | __all__ = ["pprint","pformat","isreadable","isrecursive","saferepr", | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |            "PrettyPrinter", "pp"] | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  | def pprint(object, stream=None, indent=1, width=80, depth=None, *, | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |            compact=False, sort_dicts=True): | 
					
						
							| 
									
										
										
										
											2004-05-14 16:31:56 +00:00
										 |  |  |     """Pretty-print a Python object to a stream [default is sys.stdout].""" | 
					
						
							| 
									
										
										
										
											2003-12-03 20:26:05 +00:00
										 |  |  |     printer = PrettyPrinter( | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |         stream=stream, indent=indent, width=width, depth=depth, | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |         compact=compact, sort_dicts=sort_dicts) | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  |     printer.pprint(object) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  | def pformat(object, indent=1, width=80, depth=None, *, | 
					
						
							|  |  |  |             compact=False, sort_dicts=True): | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  |     """Format a Python object into a pretty-printed representation.""" | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |     return PrettyPrinter(indent=indent, width=width, depth=depth, | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |                          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) | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-14 07:05:58 +00:00
										 |  |  | def saferepr(object): | 
					
						
							|  |  |  |     """Version of repr() which can handle recursive data structures.""" | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |     return _safe_repr(object, {}, None, 0, True)[0] | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-18 20:42:39 +00:00
										 |  |  | def isreadable(object): | 
					
						
							|  |  |  |     """Determine if saferepr(object) is readable by eval().""" | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |     return _safe_repr(object, {}, None, 0, True)[1] | 
					
						
							| 
									
										
										
										
											1997-07-18 20:42:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def isrecursive(object): | 
					
						
							|  |  |  |     """Determine if object requires a recursive representation.""" | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |     return _safe_repr(object, {}, None, 0, True)[2] | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-19 01:07:05 +00:00
										 |  |  | class _safe_key: | 
					
						
							|  |  |  |     """Helper function for key functions when sorting unorderable objects.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-17 08:32:47 +03:00
										 |  |  |     The wrapped-object will fallback to a Py2.x style comparison for | 
					
						
							| 
									
										
										
										
											2009-11-19 01:07:05 +00:00
										 |  |  |     unorderable types (sorting first comparing the type name and then by | 
					
						
							|  |  |  |     the 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 = obj | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __lt__(self, other): | 
					
						
							| 
									
										
										
										
											2012-07-21 11:17:38 +02:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2015-04-06 22:52:44 +03:00
										 |  |  |             return self.obj < other.obj | 
					
						
							| 
									
										
										
										
											2012-07-21 11:17:38 +02:00
										 |  |  |         except TypeError: | 
					
						
							| 
									
										
										
										
											2015-04-06 22:52:44 +03:00
										 |  |  |             return ((str(type(self.obj)), id(self.obj)) < \ | 
					
						
							|  |  |  |                     (str(type(other.obj)), id(other.obj))) | 
					
						
							| 
									
										
										
										
											2009-11-19 01:07:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _safe_tuple(t): | 
					
						
							|  |  |  |     "Helper function for comparing 2-tuples" | 
					
						
							|  |  |  |     return _safe_key(t[0]), _safe_key(t[1]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | class PrettyPrinter: | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |     def __init__(self, indent=1, width=80, depth=None, stream=None, *, | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |                  compact=False, sort_dicts=True): | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         """Handle pretty printing operations onto a stream using a set of
 | 
					
						
							|  |  |  |         configured parameters. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         indent | 
					
						
							|  |  |  |             Number of spaces to indent for each level of nesting. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         width | 
					
						
							|  |  |  |             Attempted maximum number of columns in the output. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         depth | 
					
						
							|  |  |  |             The maximum depth to print out nested structures. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stream | 
					
						
							|  |  |  |             The desired output stream.  If omitted (or false), the standard | 
					
						
							|  |  |  |             output stream available at construction will be used. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |         compact | 
					
						
							|  |  |  |             If true, several items will be combined in one line. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |         sort_dicts | 
					
						
							|  |  |  |             If true, dict keys are sorted. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         indent = int(indent) | 
					
						
							|  |  |  |         width = int(width) | 
					
						
							| 
									
										
										
										
											2015-03-26 08:43:21 +02:00
										 |  |  |         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') | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |         self._depth = depth | 
					
						
							|  |  |  |         self._indent_per_level = indent | 
					
						
							|  |  |  |         self._width = width | 
					
						
							| 
									
										
										
										
											2002-06-01 16:07:16 +00:00
										 |  |  |         if stream is not None: | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |             self._stream = stream | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2002-12-31 07:14:18 +00:00
										 |  |  |             self._stream = _sys.stdout | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |         self._compact = bool(compact) | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |         self._sort_dicts = sort_dicts | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def pprint(self, object): | 
					
						
							| 
									
										
										
										
											2005-11-11 18:18:51 +00:00
										 |  |  |         self._format(object, self._stream, 0, 0, {}, 0) | 
					
						
							|  |  |  |         self._stream.write("\n") | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def pformat(self, object): | 
					
						
							| 
									
										
										
										
											2002-12-31 07:14:18 +00:00
										 |  |  |         sio = _StringIO() | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |         self._format(object, sio, 0, 0, {}, 0) | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         return sio.getvalue() | 
					
						
							| 
									
										
										
										
											1997-04-16 16:59:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-18 20:42:39 +00:00
										 |  |  |     def isrecursive(self, object): | 
					
						
							| 
									
										
										
										
											2002-12-31 07:14:18 +00:00
										 |  |  |         return self.format(object, {}, 0, 0)[2] | 
					
						
							| 
									
										
										
										
											1997-07-18 20:42:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def isreadable(self, object): | 
					
						
							| 
									
										
										
										
											2002-12-31 07:14:18 +00:00
										 |  |  |         s, readable, recursive = self.format(object, {}, 0, 0) | 
					
						
							| 
									
										
										
										
											2002-04-02 05:08:35 +00:00
										 |  |  |         return readable and not recursive | 
					
						
							| 
									
										
										
										
											1997-07-18 20:42:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |     def _format(self, object, stream, indent, allowance, context, level): | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |         objid = id(object) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         if objid in context: | 
					
						
							|  |  |  |             stream.write(_recursion(object)) | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |             self._recursive = True | 
					
						
							|  |  |  |             self._readable = False | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             return | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |         rep = self._repr(object, context, level) | 
					
						
							| 
									
										
										
										
											2015-02-14 10:55:19 +02:00
										 |  |  |         max_width = self._width - indent - allowance | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |         if len(rep) > max_width: | 
					
						
							|  |  |  |             p = self._dispatch.get(type(object).__repr__, None) | 
					
						
							|  |  |  |             if p is not None: | 
					
						
							|  |  |  |                 context[objid] = 1 | 
					
						
							|  |  |  |                 p(self, object, stream, indent, allowance, context, level + 1) | 
					
						
							|  |  |  |                 del context[objid] | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |                 return | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |             elif isinstance(object, dict): | 
					
						
							|  |  |  |                 context[objid] = 1 | 
					
						
							|  |  |  |                 self._pprint_dict(object, stream, indent, allowance, | 
					
						
							|  |  |  |                                   context, level + 1) | 
					
						
							|  |  |  |                 del context[objid] | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |                 return | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |         stream.write(rep) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |     _dispatch = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_dict(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         write = stream.write | 
					
						
							|  |  |  |         write('{') | 
					
						
							|  |  |  |         if self._indent_per_level > 1: | 
					
						
							|  |  |  |             write((self._indent_per_level - 1) * ' ') | 
					
						
							|  |  |  |         length = len(object) | 
					
						
							|  |  |  |         if length: | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |             if self._sort_dicts: | 
					
						
							|  |  |  |                 items = sorted(object.items(), key=_safe_tuple) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 items = object.items() | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |             self._format_dict_items(items, stream, indent, allowance + 1, | 
					
						
							|  |  |  |                                     context, level) | 
					
						
							|  |  |  |         write('}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _dispatch[dict.__repr__] = _pprint_dict | 
					
						
							| 
									
										
										
										
											2015-03-26 08:51:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_ordered_dict(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if not len(object): | 
					
						
							|  |  |  |             stream.write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         cls = 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_dict | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _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_list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _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_tuple | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_set(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if not len(object): | 
					
						
							|  |  |  |             stream.write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         typ = object.__class__ | 
					
						
							|  |  |  |         if typ is set: | 
					
						
							|  |  |  |             stream.write('{') | 
					
						
							|  |  |  |             endchar = '}' | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             stream.write(typ.__name__ + '({') | 
					
						
							|  |  |  |             endchar = '})' | 
					
						
							|  |  |  |             indent += len(typ.__name__) + 1 | 
					
						
							|  |  |  |         object = 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_set | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_str(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         write = stream.write | 
					
						
							|  |  |  |         if not len(object): | 
					
						
							|  |  |  |             write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         chunks = [] | 
					
						
							|  |  |  |         lines = object.splitlines(True) | 
					
						
							|  |  |  |         if level == 1: | 
					
						
							|  |  |  |             indent += 1 | 
					
						
							|  |  |  |             allowance += 1 | 
					
						
							|  |  |  |         max_width1 = max_width = self._width - indent | 
					
						
							|  |  |  |         for i, line in enumerate(lines): | 
					
						
							|  |  |  |             rep = repr(line) | 
					
						
							|  |  |  |             if i == len(lines) - 1: | 
					
						
							|  |  |  |                 max_width1 -= allowance | 
					
						
							|  |  |  |             if len(rep) <= max_width1: | 
					
						
							|  |  |  |                 chunks.append(rep) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 # A list of alternating (non-space, space) strings | 
					
						
							|  |  |  |                 parts = re.findall(r'\S*\s*', line) | 
					
						
							|  |  |  |                 assert parts | 
					
						
							|  |  |  |                 assert not parts[-1] | 
					
						
							|  |  |  |                 parts.pop()  # drop empty last part | 
					
						
							|  |  |  |                 max_width2 = max_width | 
					
						
							|  |  |  |                 current = '' | 
					
						
							|  |  |  |                 for j, part in enumerate(parts): | 
					
						
							|  |  |  |                     candidate = current + part | 
					
						
							|  |  |  |                     if j == len(parts) - 1 and i == len(lines) - 1: | 
					
						
							|  |  |  |                         max_width2 -= allowance | 
					
						
							|  |  |  |                     if len(repr(candidate)) > max_width2: | 
					
						
							| 
									
										
										
										
											2014-12-20 20:57:15 +02:00
										 |  |  |                         if current: | 
					
						
							|  |  |  |                             chunks.append(repr(current)) | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |                         current = part | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         current = candidate | 
					
						
							|  |  |  |                 if current: | 
					
						
							|  |  |  |                     chunks.append(repr(current)) | 
					
						
							|  |  |  |         if len(chunks) == 1: | 
					
						
							|  |  |  |             write(rep) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         if 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_str | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 19:22:37 +02:00
										 |  |  |     def _pprint_bytes(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         write = stream.write | 
					
						
							|  |  |  |         if len(object) <= 4: | 
					
						
							|  |  |  |             write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         parens = level == 1 | 
					
						
							|  |  |  |         if parens: | 
					
						
							|  |  |  |             indent += 1 | 
					
						
							|  |  |  |             allowance += 1 | 
					
						
							|  |  |  |             write('(') | 
					
						
							|  |  |  |         delim = '' | 
					
						
							|  |  |  |         for rep in _wrap_bytes_repr(object, self._width - indent, allowance): | 
					
						
							|  |  |  |             write(delim) | 
					
						
							|  |  |  |             write(rep) | 
					
						
							|  |  |  |             if not delim: | 
					
						
							|  |  |  |                 delim = '\n' + ' '*indent | 
					
						
							|  |  |  |         if parens: | 
					
						
							|  |  |  |             write(')') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _dispatch[bytes.__repr__] = _pprint_bytes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_bytearray(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         write = stream.write | 
					
						
							|  |  |  |         write('bytearray(') | 
					
						
							|  |  |  |         self._pprint_bytes(bytes(object), stream, indent + 10, | 
					
						
							|  |  |  |                            allowance + 1, context, level + 1) | 
					
						
							|  |  |  |         write(')') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _dispatch[bytearray.__repr__] = _pprint_bytearray | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 19:31:50 +02:00
										 |  |  |     def _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_mappingproxy | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-27 01:13:18 +02:00
										 |  |  |     def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if type(object) is _types.SimpleNamespace: | 
					
						
							|  |  |  |             # The SimpleNamespace repr is "namespace" instead of the class | 
					
						
							|  |  |  |             # name, so we do the same here. For subclasses; use the class name. | 
					
						
							|  |  |  |             cls_name = 'namespace' | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             cls_name = object.__class__.__name__ | 
					
						
							|  |  |  |         indent += len(cls_name) + 1 | 
					
						
							|  |  |  |         delimnl = ',\n' + ' ' * indent | 
					
						
							|  |  |  |         items = object.__dict__.items() | 
					
						
							|  |  |  |         last_index = len(items) - 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stream.write(cls_name + '(') | 
					
						
							|  |  |  |         for i, (key, ent) in enumerate(items): | 
					
						
							|  |  |  |             stream.write(key) | 
					
						
							|  |  |  |             stream.write('=') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             last = i == last_index | 
					
						
							|  |  |  |             self._format(ent, stream, indent + len(key) + 1, | 
					
						
							|  |  |  |                          allowance if last else 1, | 
					
						
							|  |  |  |                          context, level) | 
					
						
							|  |  |  |             if not last: | 
					
						
							|  |  |  |                 stream.write(delimnl) | 
					
						
							|  |  |  |         stream.write(')') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-14 10:55:19 +02:00
										 |  |  |     def _format_dict_items(self, items, stream, indent, allowance, context, | 
					
						
							|  |  |  |                            level): | 
					
						
							|  |  |  |         write = stream.write | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |         indent += self._indent_per_level | 
					
						
							| 
									
										
										
										
											2015-02-14 10:55:19 +02:00
										 |  |  |         delimnl = ',\n' + ' ' * indent | 
					
						
							|  |  |  |         last_index = len(items) - 1 | 
					
						
							|  |  |  |         for i, (key, ent) in enumerate(items): | 
					
						
							|  |  |  |             last = i == last_index | 
					
						
							|  |  |  |             rep = 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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |     def _format_items(self, items, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         write = stream.write | 
					
						
							| 
									
										
										
										
											2015-03-24 18:45:23 +02:00
										 |  |  |         indent += self._indent_per_level | 
					
						
							|  |  |  |         if self._indent_per_level > 1: | 
					
						
							|  |  |  |             write((self._indent_per_level - 1) * ' ') | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |         delimnl = ',\n' + ' ' * indent | 
					
						
							|  |  |  |         delim = '' | 
					
						
							| 
									
										
										
										
											2015-02-14 10:55:19 +02:00
										 |  |  |         width = max_width = self._width - indent + 1 | 
					
						
							|  |  |  |         it = iter(items) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             next_ent = next(it) | 
					
						
							|  |  |  |         except StopIteration: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         last = False | 
					
						
							|  |  |  |         while not last: | 
					
						
							|  |  |  |             ent = next_ent | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 next_ent = next(it) | 
					
						
							|  |  |  |             except StopIteration: | 
					
						
							|  |  |  |                 last = True | 
					
						
							|  |  |  |                 max_width -= allowance | 
					
						
							|  |  |  |                 width -= allowance | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |             if self._compact: | 
					
						
							|  |  |  |                 rep = self._repr(ent, context, level) | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |                 w = len(rep) + 2 | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  |                 if width < w: | 
					
						
							|  |  |  |                     width = max_width | 
					
						
							|  |  |  |                     if delim: | 
					
						
							|  |  |  |                         delim = delimnl | 
					
						
							|  |  |  |                 if width >= w: | 
					
						
							|  |  |  |                     width -= w | 
					
						
							|  |  |  |                     write(delim) | 
					
						
							|  |  |  |                     delim = ', ' | 
					
						
							|  |  |  |                     write(rep) | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |             write(delim) | 
					
						
							|  |  |  |             delim = delimnl | 
					
						
							| 
									
										
										
										
											2015-02-14 10:55:19 +02:00
										 |  |  |             self._format(ent, stream, indent, | 
					
						
							|  |  |  |                          allowance if last else 1, | 
					
						
							|  |  |  |                          context, level) | 
					
						
							| 
									
										
										
										
											2013-10-02 11:56:18 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |     def _repr(self, object, context, level): | 
					
						
							| 
									
										
										
										
											2002-04-02 05:08:35 +00:00
										 |  |  |         repr, readable, recursive = self.format(object, context.copy(), | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |                                                 self._depth, level) | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         if not readable: | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |             self._readable = False | 
					
						
							| 
									
										
										
										
											2001-05-14 07:05:58 +00:00
										 |  |  |         if recursive: | 
					
						
							| 
									
										
										
										
											2002-07-08 12:28:06 +00:00
										 |  |  |             self._recursive = True | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         return repr | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-02 05:08:35 +00:00
										 |  |  |     def format(self, object, context, maxlevels, level): | 
					
						
							|  |  |  |         """Format object for a specific context, returning a string
 | 
					
						
							|  |  |  |         and flags indicating whether the representation is 'readable' | 
					
						
							|  |  |  |         and whether the object represents a recursive construct. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |         return _safe_repr(object, context, maxlevels, level, self._sort_dicts) | 
					
						
							| 
									
										
										
										
											2002-04-02 05:08:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 13:35:48 +03:00
										 |  |  |     def _pprint_default_dict(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if not len(object): | 
					
						
							|  |  |  |             stream.write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         rdf = self._repr(object.default_factory, context, level) | 
					
						
							|  |  |  |         cls = object.__class__ | 
					
						
							|  |  |  |         indent += len(cls.__name__) + 1 | 
					
						
							|  |  |  |         stream.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_dict | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_counter(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if not len(object): | 
					
						
							|  |  |  |             stream.write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         cls = 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_counter | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_chain_map(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if not len(object.maps): | 
					
						
							|  |  |  |             stream.write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         cls = object.__class__ | 
					
						
							|  |  |  |         stream.write(cls.__name__ + '(') | 
					
						
							|  |  |  |         indent += len(cls.__name__) + 1 | 
					
						
							|  |  |  |         for 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_map | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _pprint_deque(self, object, stream, indent, allowance, context, level): | 
					
						
							|  |  |  |         if not len(object): | 
					
						
							|  |  |  |             stream.write(repr(object)) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         cls = object.__class__ | 
					
						
							|  |  |  |         stream.write(cls.__name__ + '(') | 
					
						
							|  |  |  |         indent += len(cls.__name__) + 1 | 
					
						
							|  |  |  |         stream.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_deque | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _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_dict | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _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_list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _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 | 
					
						
							| 
									
										
										
										
											2002-04-02 05:08:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-14 07:05:58 +00:00
										 |  |  | # Return triple (repr_string, isreadable, isrecursive). | 
					
						
							| 
									
										
										
										
											1997-04-16 00:49:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  | def _safe_repr(object, context, maxlevels, level, sort_dicts): | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |     typ = type(object) | 
					
						
							| 
									
										
										
										
											2015-05-16 21:38:05 +03:00
										 |  |  |     if typ in _builtin_scalars: | 
					
						
							|  |  |  |         return repr(object), True, False | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-15 13:51:41 +00:00
										 |  |  |     r = getattr(typ, "__repr__", None) | 
					
						
							| 
									
										
										
										
											2003-12-03 20:15:28 +00:00
										 |  |  |     if issubclass(typ, dict) and r is dict.__repr__: | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         if not object: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |             return "{}", True, False | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |         objid = id(object) | 
					
						
							| 
									
										
											  
											
												Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r63119 | benjamin.peterson | 2008-05-11 20:41:23 -0400 (Sun, 11 May 2008) | 2 lines
  #2196 hasattr now allows SystemExit and KeyboardInterrupt to propagate
........
  r63122 | benjamin.peterson | 2008-05-11 20:46:49 -0400 (Sun, 11 May 2008) | 2 lines
  make message slightly more informative, so there's no chance of misunderstanding it
........
  r63158 | ronald.oussoren | 2008-05-12 07:24:33 -0400 (Mon, 12 May 2008) | 5 lines
  Remove references to platform 'mac'
  The 'mac' platform (that is, os.name == 'mac') was used for the MacOS 9 port,
  which is no longer supported (as of Python 2.4 IIRC).
........
  r63159 | ronald.oussoren | 2008-05-12 07:31:05 -0400 (Mon, 12 May 2008) | 8 lines
  MacOSX: remove dependency on Carbon package for urllib
  This patch removes the dependency on the Carbon package from urllib.
  The mac-specific code for getting proxy configuration is now writting in
  Python using ctypes and uses the SystemConfiguration framework instead of
  InternetConfig. Also provides a mac-specific implementation of proxy_bypass.
........
  r63162 | eric.smith | 2008-05-12 10:00:01 -0400 (Mon, 12 May 2008) | 1 line
  Added 'n' presentation type for integers.
........
  r63164 | georg.brandl | 2008-05-12 12:26:52 -0400 (Mon, 12 May 2008) | 2 lines
  #1713041: fix pprint's handling of maximum depth.
........
  r63170 | georg.brandl | 2008-05-12 12:53:42 -0400 (Mon, 12 May 2008) | 2 lines
  Fix parameter name for enumerate().
........
  r63173 | georg.brandl | 2008-05-12 13:01:58 -0400 (Mon, 12 May 2008) | 2 lines
  #2766: remove code without effect.
........
  r63174 | georg.brandl | 2008-05-12 13:04:10 -0400 (Mon, 12 May 2008) | 3 lines
  #2767: don't clear globs in run() call, since they could be needed in tearDown,
  which clears them at the end.
........
  r63175 | georg.brandl | 2008-05-12 13:14:51 -0400 (Mon, 12 May 2008) | 2 lines
  #1760: try-except-finally is one statement since PEP 341.
........
  r63186 | amaury.forgeotdarc | 2008-05-12 17:30:24 -0400 (Mon, 12 May 2008) | 2 lines
  Sync code with documentation, and remove Win95 support in winsound module.
........
  r63189 | amaury.forgeotdarc | 2008-05-12 18:21:39 -0400 (Mon, 12 May 2008) | 3 lines
  Adapt test_pyclbr to the new version of urllib.py:
  The new mac-specific functions must be ignored.
........
											
										 
											2008-05-16 02:54:33 +00:00
										 |  |  |         if maxlevels and level >= maxlevels: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |             return "{...}", False, objid in context | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         if objid in context: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |             return _recursion(object), False, True | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         context[objid] = 1 | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |         readable = True | 
					
						
							|  |  |  |         recursive = False | 
					
						
							| 
									
										
										
										
											2001-05-14 18:39:41 +00:00
										 |  |  |         components = [] | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         append = components.append | 
					
						
							|  |  |  |         level += 1 | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |         if sort_dicts: | 
					
						
							|  |  |  |             items = sorted(object.items(), key=_safe_tuple) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             items = object.items() | 
					
						
							| 
									
										
										
										
											2006-08-24 00:41:19 +00:00
										 |  |  |         for k, v in items: | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |             krepr, kreadable, krecur = _safe_repr(k, context, maxlevels, level, sort_dicts) | 
					
						
							|  |  |  |             vrepr, vreadable, vrecur = _safe_repr(v, context, maxlevels, level, sort_dicts) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             append("%s: %s" % (krepr, vrepr)) | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |             readable = readable and kreadable and vreadable | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             if krecur or vrecur: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |                 recursive = True | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         del context[objid] | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |         return "{%s}" % ", ".join(components), readable, recursive | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-12-03 20:15:28 +00:00
										 |  |  |     if (issubclass(typ, list) and r is list.__repr__) or \ | 
					
						
							|  |  |  |        (issubclass(typ, tuple) and r is tuple.__repr__): | 
					
						
							|  |  |  |         if issubclass(typ, list): | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             if not object: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |                 return "[]", True, False | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             format = "[%s]" | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |         elif len(object) == 1: | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             format = "(%s,)" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             if not object: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |                 return "()", True, False | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             format = "(%s)" | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |         objid = id(object) | 
					
						
							| 
									
										
											  
											
												Merged revisions 63119-63128,63130-63131,63133,63135-63144,63146-63148,63151-63152,63155-63165,63167-63176,63181-63186,63188-63189 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r63119 | benjamin.peterson | 2008-05-11 20:41:23 -0400 (Sun, 11 May 2008) | 2 lines
  #2196 hasattr now allows SystemExit and KeyboardInterrupt to propagate
........
  r63122 | benjamin.peterson | 2008-05-11 20:46:49 -0400 (Sun, 11 May 2008) | 2 lines
  make message slightly more informative, so there's no chance of misunderstanding it
........
  r63158 | ronald.oussoren | 2008-05-12 07:24:33 -0400 (Mon, 12 May 2008) | 5 lines
  Remove references to platform 'mac'
  The 'mac' platform (that is, os.name == 'mac') was used for the MacOS 9 port,
  which is no longer supported (as of Python 2.4 IIRC).
........
  r63159 | ronald.oussoren | 2008-05-12 07:31:05 -0400 (Mon, 12 May 2008) | 8 lines
  MacOSX: remove dependency on Carbon package for urllib
  This patch removes the dependency on the Carbon package from urllib.
  The mac-specific code for getting proxy configuration is now writting in
  Python using ctypes and uses the SystemConfiguration framework instead of
  InternetConfig. Also provides a mac-specific implementation of proxy_bypass.
........
  r63162 | eric.smith | 2008-05-12 10:00:01 -0400 (Mon, 12 May 2008) | 1 line
  Added 'n' presentation type for integers.
........
  r63164 | georg.brandl | 2008-05-12 12:26:52 -0400 (Mon, 12 May 2008) | 2 lines
  #1713041: fix pprint's handling of maximum depth.
........
  r63170 | georg.brandl | 2008-05-12 12:53:42 -0400 (Mon, 12 May 2008) | 2 lines
  Fix parameter name for enumerate().
........
  r63173 | georg.brandl | 2008-05-12 13:01:58 -0400 (Mon, 12 May 2008) | 2 lines
  #2766: remove code without effect.
........
  r63174 | georg.brandl | 2008-05-12 13:04:10 -0400 (Mon, 12 May 2008) | 3 lines
  #2767: don't clear globs in run() call, since they could be needed in tearDown,
  which clears them at the end.
........
  r63175 | georg.brandl | 2008-05-12 13:14:51 -0400 (Mon, 12 May 2008) | 2 lines
  #1760: try-except-finally is one statement since PEP 341.
........
  r63186 | amaury.forgeotdarc | 2008-05-12 17:30:24 -0400 (Mon, 12 May 2008) | 2 lines
  Sync code with documentation, and remove Win95 support in winsound module.
........
  r63189 | amaury.forgeotdarc | 2008-05-12 18:21:39 -0400 (Mon, 12 May 2008) | 3 lines
  Adapt test_pyclbr to the new version of urllib.py:
  The new mac-specific functions must be ignored.
........
											
										 
											2008-05-16 02:54:33 +00:00
										 |  |  |         if maxlevels and level >= maxlevels: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |             return format % "...", False, objid in context | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         if objid in context: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |             return _recursion(object), False, True | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         context[objid] = 1 | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |         readable = True | 
					
						
							|  |  |  |         recursive = False | 
					
						
							| 
									
										
										
										
											2001-05-14 18:39:41 +00:00
										 |  |  |         components = [] | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         append = components.append | 
					
						
							|  |  |  |         level += 1 | 
					
						
							|  |  |  |         for o in object: | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |             orepr, oreadable, orecur = _safe_repr(o, context, maxlevels, level, sort_dicts) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             append(orepr) | 
					
						
							|  |  |  |             if not oreadable: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |                 readable = False | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |             if orecur: | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |                 recursive = True | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |         del context[objid] | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |         return format % ", ".join(components), readable, recursive | 
					
						
							| 
									
										
										
										
											2001-11-13 21:51:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-02-12 17:35:32 +00:00
										 |  |  |     rep = repr(object) | 
					
						
							| 
									
										
										
										
											2002-04-07 06:36:23 +00:00
										 |  |  |     return rep, (rep and not rep.startswith('<')), False | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-16 21:38:05 +03:00
										 |  |  | _builtin_scalars = frozenset({str, bytes, bytearray, int, float, complex, | 
					
						
							|  |  |  |                               bool, type(None)}) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _recursion(object): | 
					
						
							|  |  |  |     return ("<Recursion on %s with id=%s>" | 
					
						
							| 
									
										
										
										
											2013-10-03 21:29:36 +02:00
										 |  |  |             % (type(object).__name__, id(object))) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _perfcheck(object=None): | 
					
						
							|  |  |  |     import time | 
					
						
							|  |  |  |     if object is None: | 
					
						
							|  |  |  |         object = [("string", (1, 2), [3, 4], {5: 6, 7: 8})] * 100000 | 
					
						
							|  |  |  |     p = PrettyPrinter() | 
					
						
							| 
									
										
										
										
											2018-12-17 11:30:34 +01:00
										 |  |  |     t1 = time.perf_counter() | 
					
						
							| 
									
										
										
										
											2019-03-22 18:22:20 +01:00
										 |  |  |     _safe_repr(object, {}, None, 0, True) | 
					
						
							| 
									
										
										
										
											2018-12-17 11:30:34 +01:00
										 |  |  |     t2 = time.perf_counter() | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  |     p.pformat(object) | 
					
						
							| 
									
										
										
										
											2018-12-17 11:30:34 +01:00
										 |  |  |     t3 = time.perf_counter() | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |     print("_safe_repr:", t2 - t1) | 
					
						
							|  |  |  |     print("pformat:", t3 - t2) | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 19:22:37 +02:00
										 |  |  | def _wrap_bytes_repr(object, width, allowance): | 
					
						
							|  |  |  |     current = b'' | 
					
						
							|  |  |  |     last = len(object) // 4 * 4 | 
					
						
							|  |  |  |     for i in range(0, len(object), 4): | 
					
						
							|  |  |  |         part = object[i: i+4] | 
					
						
							|  |  |  |         candidate = current + part | 
					
						
							|  |  |  |         if i == last: | 
					
						
							|  |  |  |             width -= allowance | 
					
						
							|  |  |  |         if len(repr(candidate)) > width: | 
					
						
							|  |  |  |             if current: | 
					
						
							|  |  |  |                 yield repr(current) | 
					
						
							|  |  |  |             current = part | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             current = candidate | 
					
						
							|  |  |  |     if current: | 
					
						
							|  |  |  |         yield repr(current) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-01 17:50:38 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     _perfcheck() |