Pretty print python objects in a tree format.
Project description
printree
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 36924fd545c1e197914ce8318a9c7c2b67b6258e381fe9935a40149ed885f588 |
|
MD5 | edf76ddeece504d9e84a14b7f9d037ab |
|
BLAKE2b-256 | 57d13e7a185408d051667ec3f1d304467e0fbad67bec74c8185c729b7a3812ab |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 53c49752c15acfbd4fa61d267f797b984d04d1d799b54b0074d4d479fc90ede2 |
|
MD5 | 0078c737ca46938225d7596473de28d4 |
|
BLAKE2b-256 | 41492813abd7be107f76afdb74bbad1dd95529e935d2e10beef22ff407113bad |