SILENT KILLERPanel

Current Path: > > opt > alt > python312 > lib64 > python3.12 >


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/alt/python312/lib64/python3.12/

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
asyncio Directory - -
collections Directory - -
concurrent Directory - -
config-3.12-x86_64-linux-gnu Directory - -
ctypes Directory - -
curses Directory - -
dbm Directory - -
email Directory - -
encodings Directory - -
ensurepip Directory - -
html Directory - -
http Directory - -
importlib Directory - -
json Directory - -
lib-dynload Directory - -
lib2to3 Directory - -
logging Directory - -
multiprocessing Directory - -
pydoc_data Directory - -
re Directory - -
site-packages Directory - -
sqlite3 Directory - -
tomllib Directory - -
unittest Directory - -
urllib Directory - -
venv Directory - -
wsgiref Directory - -
xml Directory - -
xmlrpc Directory - -
zipfile Directory - -
zoneinfo Directory - -
LICENSE.txt File 13936 bytes June 03 2025 15:41:47.
__future__.py File 5218 bytes June 23 2025 13:48:52.
__hello__.py File 227 bytes June 23 2025 13:48:52.
_aix_support.py File 4021 bytes June 23 2025 13:48:49.
_collections_abc.py File 32089 bytes June 23 2025 13:48:37.
_compat_pickle.py File 8761 bytes June 23 2025 13:48:48.
_compression.py File 5681 bytes June 23 2025 13:48:37.
_markupbase.py File 14653 bytes June 23 2025 13:48:37.
_osx_support.py File 22023 bytes June 23 2025 13:48:50.
_py_abc.py File 6189 bytes June 23 2025 13:48:51.
_pydatetime.py File 92087 bytes June 23 2025 13:48:51.
_pydecimal.py File 227283 bytes June 23 2025 13:48:36.
_pyio.py File 93593 bytes June 23 2025 13:48:37.
_pylong.py File 10790 bytes June 23 2025 13:48:37.
_sitebuiltins.py File 3128 bytes June 23 2025 13:48:37.
_strptime.py File 28393 bytes June 23 2025 13:48:51.
_sysconfigdata__linux_x86_64-linux-gnu.py File 76553 bytes June 23 2025 13:58:24.
_sysconfigdata_d_linux_x86_64-linux-gnu.py File 76549 bytes June 23 2025 13:51:17.
_threading_local.py File 7220 bytes June 23 2025 13:48:37.
_weakrefset.py File 5893 bytes June 23 2025 13:48:36.
abc.py File 6538 bytes June 23 2025 13:48:37.
aifc.py File 34211 bytes June 23 2025 13:48:51.
antigravity.py File 500 bytes June 23 2025 13:48:37.
argparse.py File 101155 bytes June 23 2025 13:48:49.
ast.py File 64452 bytes June 23 2025 13:48:50.
base64.py File 20648 bytes June 23 2025 13:48:37.
bdb.py File 33573 bytes June 23 2025 13:48:48.
bisect.py File 3423 bytes June 23 2025 13:48:36.
bz2.py File 11847 bytes June 23 2025 13:48:50.
cProfile.py File 6569 bytes June 23 2025 13:48:36.
calendar.py File 25864 bytes June 23 2025 13:48:49.
cgi.py File 34432 bytes June 23 2025 13:48:50.
cgitb.py File 12421 bytes June 23 2025 13:48:52.
chunk.py File 5500 bytes June 23 2025 13:48:37.
cmd.py File 14873 bytes June 23 2025 13:48:36.
code.py File 10962 bytes June 23 2025 13:48:37.
codecs.py File 36870 bytes June 23 2025 13:48:37.
codeop.py File 5908 bytes June 23 2025 13:48:36.
colorsys.py File 4062 bytes June 23 2025 13:48:37.
compileall.py File 20507 bytes June 23 2025 13:48:36.
configparser.py File 53789 bytes June 23 2025 13:48:37.
contextlib.py File 27637 bytes June 23 2025 13:48:36.
contextvars.py File 129 bytes June 23 2025 13:48:48.
copy.py File 8412 bytes June 23 2025 13:48:37.
copyreg.py File 7614 bytes June 23 2025 13:48:50.
crypt.py File 3913 bytes June 23 2025 13:48:37.
csv.py File 16386 bytes June 23 2025 13:48:37.
dataclasses.py File 62085 bytes June 23 2025 13:48:50.
datetime.py File 268 bytes June 23 2025 13:48:52.
decimal.py File 2805 bytes June 23 2025 13:48:49.
difflib.py File 83368 bytes June 23 2025 13:48:37.
dis.py File 30227 bytes June 23 2025 13:48:37.
doctest.py File 106749 bytes June 23 2025 13:48:37.
enum.py File 81540 bytes June 23 2025 13:48:37.
filecmp.py File 10381 bytes June 23 2025 13:48:37.
fileinput.py File 15714 bytes June 23 2025 13:48:37.
fnmatch.py File 5999 bytes June 23 2025 13:48:37.
fractions.py File 38147 bytes June 23 2025 13:48:36.
ftplib.py File 34735 bytes June 23 2025 13:48:37.
functools.py File 37940 bytes June 23 2025 13:48:52.
genericpath.py File 5572 bytes June 23 2025 13:48:52.
getopt.py File 7488 bytes June 23 2025 13:48:50.
getpass.py File 5990 bytes June 23 2025 13:48:36.
gettext.py File 21320 bytes June 23 2025 13:48:50.
glob.py File 8732 bytes June 23 2025 13:48:36.
graphlib.py File 9648 bytes June 23 2025 13:48:36.
gzip.py File 25402 bytes June 23 2025 13:48:50.
hashlib.py File 9349 bytes June 23 2025 13:48:51.
heapq.py File 23024 bytes June 23 2025 13:48:36.
hmac.py File 7716 bytes June 23 2025 13:48:37.
imaplib.py File 54040 bytes June 23 2025 13:48:49.
imghdr.py File 4398 bytes June 23 2025 13:48:50.
inspect.py File 127125 bytes June 23 2025 13:48:48.
io.py File 3582 bytes June 23 2025 13:48:37.
ipaddress.py File 81414 bytes June 23 2025 13:48:49.
keyword.py File 1073 bytes June 23 2025 13:48:50.
linecache.py File 5800 bytes June 23 2025 13:48:37.
locale.py File 78599 bytes June 23 2025 13:48:48.
lzma.py File 13277 bytes June 23 2025 13:48:51.
mailbox.py File 78911 bytes June 23 2025 13:48:48.
mailcap.py File 9333 bytes June 23 2025 13:48:36.
mimetypes.py File 23037 bytes June 23 2025 13:48:48.
modulefinder.py File 23699 bytes June 23 2025 13:48:37.
netrc.py File 6922 bytes June 23 2025 13:48:37.
nntplib.py File 41087 bytes June 23 2025 13:48:36.
ntpath.py File 32324 bytes June 23 2025 13:48:36.
nturl2path.py File 2374 bytes June 23 2025 13:48:50.
numbers.py File 11467 bytes June 23 2025 13:48:51.
opcode.py File 13174 bytes June 23 2025 13:48:52.
operator.py File 10965 bytes June 23 2025 13:48:48.
optparse.py File 60369 bytes June 23 2025 13:48:50.
os.py File 40821 bytes June 23 2025 13:48:36.
pathlib.py File 51052 bytes June 23 2025 13:48:49.
pdb.py File 70311 bytes June 23 2025 13:48:37.
pickle.py File 66911 bytes June 23 2025 13:48:37.
pickletools.py File 94052 bytes June 23 2025 13:48:37.
pipes.py File 8978 bytes June 23 2025 13:48:50.
pkgutil.py File 18281 bytes June 23 2025 13:48:37.
platform.py File 43402 bytes June 23 2025 13:48:37.
plistlib.py File 28342 bytes June 23 2025 13:48:36.
poplib.py File 14619 bytes June 23 2025 13:48:36.
posixpath.py File 17483 bytes June 23 2025 13:48:37.
pprint.py File 24158 bytes June 23 2025 13:48:37.
profile.py File 23106 bytes June 23 2025 13:48:37.
pstats.py File 29289 bytes June 23 2025 13:48:37.
pty.py File 6137 bytes June 23 2025 13:48:36.
py_compile.py File 7837 bytes June 23 2025 13:48:49.
pyclbr.py File 11396 bytes June 23 2025 13:48:36.
pydoc.py File 113522 bytes June 23 2025 13:48:37.
queue.py File 11496 bytes June 23 2025 13:48:50.
quopri.py File 7197 bytes June 23 2025 13:48:50.
random.py File 34689 bytes June 23 2025 13:48:36.
reprlib.py File 7148 bytes June 23 2025 13:48:37.
rlcompleter.py File 7827 bytes June 23 2025 13:48:52.
runpy.py File 12885 bytes June 23 2025 13:48:36.
sched.py File 6351 bytes June 23 2025 13:48:49.
secrets.py File 1984 bytes June 23 2025 13:48:37.
selectors.py File 19671 bytes June 23 2025 13:48:37.
shelve.py File 8560 bytes June 23 2025 13:48:49.
shlex.py File 13353 bytes June 23 2025 13:48:51.
shutil.py File 56762 bytes June 23 2025 13:48:49.
signal.py File 2495 bytes June 23 2025 13:48:49.
site.py File 23198 bytes June 23 2025 13:48:48.
smtplib.py File 43545 bytes June 23 2025 13:48:37.
sndhdr.py File 7448 bytes June 23 2025 13:48:50.
socket.py File 37815 bytes June 23 2025 13:48:51.
socketserver.py File 28065 bytes June 23 2025 13:48:52.
sre_compile.py File 231 bytes June 23 2025 13:48:37.
sre_constants.py File 232 bytes June 23 2025 13:48:36.
sre_parse.py File 229 bytes June 23 2025 13:48:37.
ssl.py File 50904 bytes June 23 2025 13:48:48.
stat.py File 5485 bytes June 23 2025 13:48:49.
statistics.py File 50227 bytes June 23 2025 13:48:37.
string.py File 11786 bytes June 23 2025 13:48:50.
stringprep.py File 12917 bytes June 23 2025 13:48:37.
struct.py File 257 bytes June 23 2025 13:48:37.
subprocess.py File 88747 bytes June 23 2025 13:48:36.
sunau.py File 18478 bytes June 23 2025 13:48:37.
symtable.py File 12477 bytes June 23 2025 13:48:50.
sysconfig.py File 31850 bytes June 23 2025 13:48:49.
tabnanny.py File 11545 bytes June 23 2025 13:48:50.
tarfile.py File 112458 bytes June 23 2025 13:48:37.
telnetlib.py File 23334 bytes June 23 2025 13:48:37.
tempfile.py File 32386 bytes June 23 2025 13:48:36.
textwrap.py File 19718 bytes June 23 2025 13:48:36.
this.py File 1003 bytes June 23 2025 13:48:37.
threading.py File 60200 bytes June 23 2025 13:48:49.
timeit.py File 13477 bytes June 23 2025 13:48:37.
token.py File 2511 bytes June 23 2025 13:48:36.
tokenize.py File 21570 bytes June 23 2025 13:48:49.
trace.py File 29366 bytes June 23 2025 13:48:36.
traceback.py File 46393 bytes June 23 2025 13:48:49.
tracemalloc.py File 18047 bytes June 23 2025 13:48:50.
tty.py File 2035 bytes June 23 2025 13:48:36.
types.py File 10993 bytes June 23 2025 13:48:36.
typing.py File 118836 bytes June 23 2025 13:48:50.
uu.py File 7341 bytes June 23 2025 13:59:33.
uuid.py File 29656 bytes June 23 2025 13:48:37.
warnings.py File 21909 bytes June 23 2025 13:48:37.
wave.py File 22769 bytes June 23 2025 13:48:37.
weakref.py File 21513 bytes June 23 2025 13:48:49.
webbrowser.py File 23746 bytes June 23 2025 13:48:50.
xdrlib.py File 5942 bytes June 23 2025 13:48:52.
zipapp.py File 7543 bytes June 23 2025 13:48:37.
zipimport.py File 27840 bytes June 23 2025 13:48:49.

Reading File: //opt/alt/python312/lib64/python3.12//pprint.py

#  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 configured
    set 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 recursive
    data structures.

"""

import collections as _collections
import dataclasses as _dataclasses
import re
import sys as _sys
import types as _types
from 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, underscore_numbers=False):
    """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,
        underscore_numbers=underscore_numbers)
    printer.pprint(object)

def pformat(object, indent=1, width=80, depth=None, *,
            compact=False, sort_dicts=True, underscore_numbers=False):
    """Format a Python object into a pretty-printed representation."""
    return PrettyPrinter(indent=indent, width=width, depth=depth,
                         compact=compact, sort_dicts=sort_dicts,
                         underscore_numbers=underscore_numbers).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 PrettyPrinter()._safe_repr(object, {}, None, 0)[0]

def isreadable(object):
    """Determine if saferepr(object) is readable by eval()."""
    return PrettyPrinter()._safe_repr(object, {}, None, 0)[1]

def isrecursive(object):
    """Determine if object requires a recursive representation."""
    return PrettyPrinter()._safe_repr(object, {}, None, 0)[2]

class _safe_key:
    """Helper function for key functions when sorting unorderable objects.

    The wrapped-object will fallback to a Py2.x style comparison for
    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):
        try:
            return self.obj < other.obj
        except 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, underscore_numbers=False):
        """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.

        compact
            If true, several items will be combined in one line.

        sort_dicts
            If true, dict keys are sorted.

        underscore_numbers
            If true, digit groups are separated with underscores.

        """
        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 = depth
        self._indent_per_level = indent
        self._width = width
        if stream is not None:
            self._stream = stream
        else:
            self._stream = _sys.stdout
        self._compact = bool(compact)
        self._sort_dicts = sort_dicts
        self._underscore_numbers = underscore_numbers

    def pprint(self, object):
        if self._stream is not None:
            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 recursive

    def _format(self, object, stream, indent, allowance, context, level):
        objid = id(object)
        if objid in context:
            stream.write(_recursion(object))
            self._recursive = True
            self._readable = False
            return
        rep = self._repr(object, context, level)
        max_width = self._width - indent - allowance
        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]
                return
            elif (_dataclasses.is_dataclass(object) and
                  not isinstance(object, type) and
                  object.__dataclass_params__.repr and
                  # Check dataclass has generated repr method.
                  hasattr(object.__repr__, "__wrapped__") and
                  "__create_fn__" in object.__repr__.__wrapped__.__qualname__):
                context[objid] = 1
                self._pprint_dataclass(object, stream, indent, allowance, context, level + 1)
                del context[objid]
                return
        stream.write(rep)

    def _pprint_dataclass(self, object, stream, indent, allowance, context, level):
        cls_name = object.__class__.__name__
        indent += len(cls_name) + 1
        items = [(f.name, getattr(object, f.name)) for f in _dataclasses.fields(object) if f.repr]
        stream.write(cls_name + '(')
        self._format_namespace_items(items, stream, indent, allowance, context, level)
        stream.write(')')

    _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:
            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_dict

    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

    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:
                        if current:
                            chunks.append(repr(current))
                        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

    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

    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

    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
        items = object.__dict__.items()
        stream.write(cls_name + '(')
        self._format_namespace_items(items, stream, indent, allowance, context, level)
        stream.write(')')

    _dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace

    def _format_dict_items(self, items, stream, indent, allowance, context,
                           level):
        write = stream.write
        indent += self._indent_per_level
        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)

    def _format_namespace_items(self, items, stream, indent, allowance, context, level):
        write = stream.write
        delimnl = ',\n' + ' ' * indent
        last_index = len(items) - 1
        for i, (key, ent) in enumerate(items):
            last = i == last_index
            write(key)
            write('=')
            if id(ent) in context:
                # Special-case representation of recursion to match standard
                # recursive dataclass repr.
                write("...")
            else:
                self._format(ent, stream, indent + len(key) + 1,
                             allowance if last else 1,
                             context, level)
            if not last:
                write(delimnl)

    def _format_items(self, items, stream, indent, allowance, context, level):
        write = stream.write
        indent += self._indent_per_level
        if self._indent_per_level > 1:
            write((self._indent_per_level - 1) * ' ')
        delimnl = ',\n' + ' ' * indent
        delim = ''
        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
            if self._compact:
                rep = self._repr(ent, context, level)
                w = len(rep) + 2
                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
            self._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 = False
        if recursive:
            self._recursive = True
        return repr

    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.
        """
        return self._safe_repr(object, context, maxlevels, level)

    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

    def _safe_repr(self, object, context, maxlevels, level):
        # Return triple (repr_string, isreadable, isrecursive).
        typ = type(object)
        if typ in _builtin_scalars:
            return repr(object), True, False

        r = getattr(typ, "__repr__", None)

        if issubclass(typ, int) and r is int.__repr__:
            if self._underscore_numbers:
                return f"{object:_d}", True, False
            else:
                return repr(object), True, False

        if issubclass(typ, dict) and r is dict.__repr__:
            if not object:
                return "{}", True, False
            objid = id(object)
            if maxlevels and level >= maxlevels:
                return "{...}", False, objid in context
            if objid in context:
                return _recursion(object), False, True
            context[objid] = 1
            readable = True
            recursive = False
            components = []
            append = components.append
            level += 1
            if self._sort_dicts:
                items = sorted(object.items(), key=_safe_tuple)
            else:
                items = object.items()
            for k, v in items:
                krepr, kreadable, krecur = self.format(
                    k, context, maxlevels, level)
                vrepr, vreadable, vrecur = self.format(
                    v, context, maxlevels, level)
                append("%s: %s" % (krepr, vrepr))
                readable = readable and kreadable and vreadable
                if krecur or vrecur:
                    recursive = True
            del context[objid]
            return "{%s}" % ", ".join(components), readable, recursive

        if (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, False
                format = "[%s]"
            elif len(object) == 1:
                format = "(%s,)"
            else:
                if not object:
                    return "()", True, False
                format = "(%s)"
            objid = id(object)
            if maxlevels and level >= maxlevels:
                return format % "...", False, objid in context
            if objid in context:
                return _recursion(object), False, True
            context[objid] = 1
            readable = True
            recursive = False
            components = []
            append = components.append
            level += 1
            for o in object:
                orepr, oreadable, orecur = self.format(
                    o, context, maxlevels, level)
                append(orepr)
                if not oreadable:
                    readable = False
                if orecur:
                    recursive = True
            del context[objid]
            return format % ", ".join(components), readable, recursive

        rep = repr(object)
        return rep, (rep and not rep.startswith('<')), False

_builtin_scalars = frozenset({str, bytes, bytearray, float, complex,
                              bool, type(None)})

def _recursion(object):
    return ("<Recursion on %s with id=%s>"
            % (type(object).__name__, id(object)))


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)

SILENT KILLER Tool