Tree Rendering¶
Tree Rendering.
RenderTree
using the following styles:
- class anytree.render.Row(pre, fill, node)¶
Create new instance of Row(pre, fill, node)
- fill¶
Alias for field number 1
- node¶
Alias for field number 2
- pre¶
Alias for field number 0
- class anytree.render.AbstractStyle(vertical, cont, end)[source]¶
Tree Render Style.
- Parameters:
vertical – Sign for vertical line.
cont – Chars for a continued branch.
end – Chars for the last branch.
- property empty¶
Empty string as placeholder.
- class anytree.render.AsciiStyle[source]¶
Ascii style.
>>> from anytree import Node, RenderTree >>> root = Node("root") >>> s0 = Node("sub0", parent=root) >>> s0b = Node("sub0B", parent=s0) >>> s0a = Node("sub0A", parent=s0) >>> s1 = Node("sub1", parent=root)
>>> print(RenderTree(root, style=AsciiStyle())) Node('/root') |-- Node('/root/sub0') | |-- Node('/root/sub0/sub0B') | +-- Node('/root/sub0/sub0A') +-- Node('/root/sub1')
- class anytree.render.ContStyle[source]¶
Continued style, without gaps.
>>> from anytree import Node, RenderTree >>> root = Node("root") >>> s0 = Node("sub0", parent=root) >>> s0b = Node("sub0B", parent=s0) >>> s0a = Node("sub0A", parent=s0) >>> s1 = Node("sub1", parent=root)
>>> print(RenderTree(root, style=ContStyle())) Node('/root') ├── Node('/root/sub0') │ ├── Node('/root/sub0/sub0B') │ └── Node('/root/sub0/sub0A') └── Node('/root/sub1')
- class anytree.render.ContRoundStyle[source]¶
Continued style, without gaps, round edges.
>>> from anytree import Node, RenderTree >>> root = Node("root") >>> s0 = Node("sub0", parent=root) >>> s0b = Node("sub0B", parent=s0) >>> s0a = Node("sub0A", parent=s0) >>> s1 = Node("sub1", parent=root)
>>> print(RenderTree(root, style=ContRoundStyle())) Node('/root') ├── Node('/root/sub0') │ ├── Node('/root/sub0/sub0B') │ ╰── Node('/root/sub0/sub0A') ╰── Node('/root/sub1')
- class anytree.render.DoubleStyle[source]¶
Double line style, without gaps.
>>> from anytree import Node, RenderTree >>> root = Node("root") >>> s0 = Node("sub0", parent=root) >>> s0b = Node("sub0B", parent=s0) >>> s0a = Node("sub0A", parent=s0) >>> s1 = Node("sub1", parent=root)
>>> print(RenderTree(root, style=DoubleStyle)) Node('/root') ╠══ Node('/root/sub0') ║ ╠══ Node('/root/sub0/sub0B') ║ ╚══ Node('/root/sub0/sub0A') ╚══ Node('/root/sub1')
- class anytree.render.RenderTree(node, style=ContStyle(), childiter=<class 'list'>, maxlevel=None)[source]¶
Render tree starting at node.
- Keyword Arguments:
style (AbstractStyle) – Render Style.
childiter – Child iterator.
maxlevel – Limit rendering to this depth.
RenderTree
is an iterator, returning a tuple with 3 items:- pre
tree prefix.
- fill
filling for multiline entries.
- node
NodeMixin
object.
It is up to the user to assemble these parts to a whole.
>>> from anytree import Node, RenderTree >>> root = Node("root", lines=["c0fe", "c0de"]) >>> s0 = Node("sub0", parent=root, lines=["ha", "ba"]) >>> s0b = Node("sub0B", parent=s0, lines=["1", "2", "3"]) >>> s0a = Node("sub0A", parent=s0, lines=["a", "b"]) >>> s1 = Node("sub1", parent=root, lines=["Z"])
Simple one line:
>>> for pre, _, node in RenderTree(root): ... print("%s%s" % (pre, node.name)) root ├── sub0 │ ├── sub0B │ └── sub0A └── sub1
Multiline:
>>> for pre, fill, node in RenderTree(root): ... print("%s%s" % (pre, node.lines[0])) ... for line in node.lines[1:]: ... print("%s%s" % (fill, line)) c0fe c0de ├── ha │ ba │ ├── 1 │ │ 2 │ │ 3 │ └── a │ b └── Z
maxlevel limits the depth of the tree:
>>> print(RenderTree(root, maxlevel=2)) Node('/root', lines=['c0fe', 'c0de']) ├── Node('/root/sub0', lines=['ha', 'ba']) └── Node('/root/sub1', lines=['Z'])
The childiter is responsible for iterating over child nodes at the same level. An reversed order can be achived by using reversed.
>>> for row in RenderTree(root, childiter=reversed): ... print("%s%s" % (row.pre, row.node.name)) root ├── sub1 └── sub0 ├── sub0A └── sub0B
Or writing your own sort function:
>>> def mysort(items): ... return sorted(items, key=lambda item: item.name) >>> for row in RenderTree(root, childiter=mysort): ... print("%s%s" % (row.pre, row.node.name)) root ├── sub0 │ ├── sub0A │ └── sub0B └── sub1
by_attr
simplifies attribute rendering and supports multiline:>>> print(RenderTree(root).by_attr()) root ├── sub0 │ ├── sub0B │ └── sub0A └── sub1 >>> print(RenderTree(root).by_attr("lines")) c0fe c0de ├── ha │ ba │ ├── 1 │ │ 2 │ │ 3 │ └── a │ b └── Z
And can be a function:
>>> print(RenderTree(root).by_attr(lambda n: " ".join(n.lines))) c0fe c0de ├── ha ba │ ├── 1 2 3 │ └── a b └── Z
- by_attr(attrname='name')[source]¶
Return rendered tree with node attribute attrname.
>>> from anytree import AnyNode, RenderTree >>> root = AnyNode(id="root") >>> s0 = AnyNode(id="sub0", parent=root) >>> s0b = AnyNode(id="sub0B", parent=s0, foo=4, bar=109) >>> s0a = AnyNode(id="sub0A", parent=s0) >>> s1 = AnyNode(id="sub1", parent=root) >>> s1a = AnyNode(id="sub1A", parent=s1) >>> s1b = AnyNode(id="sub1B", parent=s1, bar=8) >>> s1c = AnyNode(id="sub1C", parent=s1) >>> s1ca = AnyNode(id="sub1Ca", parent=s1c) >>> print(RenderTree(root).by_attr('id')) root ├── sub0 │ ├── sub0B │ └── sub0A └── sub1 ├── sub1A ├── sub1B └── sub1C └── sub1Ca