Skip to main content

Pretty print python objects in a tree format.

Project description

printree

Build Status Coverage Status Documentation Status PyPI version PyPI

Tree-like formatting for arbitrary python data structures.

Instalation

pip install printree

Usage

printree aims to be similar to pretty print (pprint) with a format inspired by the tree command:

>>> from printree import ptree, ftree
>>> ptree({"x", len, 42})  # will print to the output console

├── 0: x
├── 1: <built-in function len>
└── 2: 42
>>> ftree({"x", len, 42})  # will return a string representation
'┐\n├── 0: x\n├── 1: <built-in function len>\n└── 2: 42'

Instances of abc.Iterable (with the exception of str & bytes) will be represented as branches. All other objects will be considered leaf nodes:

>>> from printree import ptree
>>> dct = {
...     "foo": [],
...     True: {
...         "uno": {"ABC", "XYZ"},
...         "dos": r"B:\newline\tab\like.ext",
...         "tres": {
...             "leaf": b"bytes",
...             "numbers": (42, -17, 0.01)
...         },
...     },
...     ("tuple", "as", "key"):
...         {"multi\nlined\n\ttabbed key": "multi\nline\n\ttabbed value"}
... }
>>> dct["recursion"] = [1, dct, 2]
>>> ptree(dct)

├── foo
├── True
   ├── uno
      ├── 0: XYZ
      └── 1: ABC
   ├── dos: B:\newline\tab\like.ext
   └── tres
       ├── leaf: b'bytes'
       └── numbers
           ├── 0: 42
           ├── 1: -17
           └── 2: 0.01
├── ('tuple', 'as', 'key')
   └── multi
       lined
               tabbed key: multi
                           line
                               tabbed value
└── recursion
    ├── 0: 1
    ├── 1: <Recursion on dict with id=2414949505984>
    └── 2: 2

The annotated and depth arguments modify verbosity of the output when creating the tree representation:

>>> ptree(dct, depth=2, annotated=True)
  dict[items=4]
├── foo  list[empty]
├── True  dict[items=3]
   ├── uno  set[items=2] [...]
   ├── dos: B:\newline\tab\like.ext
   └── tres  dict[items=2] [...]
├── ('tuple', 'as', 'key')  dict[items=1]
   └── multi
       lined
               tabbed key: multi
                           line
                               tabbed value
└── recursion  list[items=3]
    ├── 0: 1
    ├── 1: <Recursion on dict with id=2414949505984>
    └── 2: 2

Customizing formatting

TreePrinter subclasses can change each of the string representations of the tree. The subclass AsciiPrinter is provided as an example:

>>> from printree import AsciiPrinter
>>> obj = [42, {"foo": (True, False)}]
>>> AsciiPrinter(annotated=True).ptree(obj)
. -> list[items=2]
|-- 0: 42
`-- 1 -> dict[items=1]
    `-- foo -> tuple[items=2]
        |-- 0: True
        `-- 1: False

The main members to override are:

  • ROOT
  • EDGE
  • BRANCH_NEXT
  • BRANCH_LAST
  • ARROW

The level attribute will be automatically set on the printer instance to indicate the current depth in the traversal of the tree.

To print each branch level with a different color, something like the following could be implemented:

from printree import TreePrinter

class ColoredTree(TreePrinter):
    colors = {
        0: '\033[31m',  # red
        1: '\033[32m',  # green
        2: '\033[33m',  # yellow
        3: '\033[36m',  # cyan
        4: '\033[35m',  # magenta
    }
    _RESET = '\033[0m'

    def __getattribute__(self, item):
        if item in ("EDGE", "BRANCH_NEXT", "BRANCH_LAST"):
            return f"{self.color}{getattr(super(), item)}{self._RESET}"
        return super().__getattribute__(item)

    @property
    def color(self):
        return self.colors[self.level % len(self.colors)]

    @property
    def ROOT(self):  # for root (level 0), prefer the color of the children (level 1) 
        return f'{self.colors[1]}{super().ROOT}{self._RESET}'


multiline = {"foo": {False: {"AB\nCD": "xy", 42:len}, True: []}, ("bar",): []}
dct = {"A": multiline, "B": (multiline,), "C\nD": "x\ny", "F": (1, "2")}

import os
os.system("")  # required on windows only

ColoredTree().ptree(dct)

Which outputs:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

printree-0.2.0.tar.gz (8.0 kB view details)

Uploaded Source

Built Distribution

printree-0.2.0-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file printree-0.2.0.tar.gz.

File metadata

  • Download URL: printree-0.2.0.tar.gz
  • Upload date:
  • Size: 8.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.8.0

File hashes

Hashes for printree-0.2.0.tar.gz
Algorithm Hash digest
SHA256 36924fd545c1e197914ce8318a9c7c2b67b6258e381fe9935a40149ed885f588
MD5 edf76ddeece504d9e84a14b7f9d037ab
BLAKE2b-256 57d13e7a185408d051667ec3f1d304467e0fbad67bec74c8185c729b7a3812ab

See more details on using hashes here.

File details

Details for the file printree-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: printree-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.8.0

File hashes

Hashes for printree-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 53c49752c15acfbd4fa61d267f797b984d04d1d799b54b0074d4d479fc90ede2
MD5 0078c737ca46938225d7596473de28d4
BLAKE2b-256 41492813abd7be107f76afdb74bbad1dd95529e935d2e10beef22ff407113bad

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page