.. image:: https://badge.fury.io/py/anytree.svg
:target: https://badge.fury.io/py/anytree
.. image:: https://img.shields.io/pypi/dm/anytree.svg?label=pypi%20downloads
:target: https://pypi.python.org/pypi/anytree
.. image:: https://readthedocs.org/projects/anytree/badge/?version=latest
:target: https://anytree.readthedocs.io/en/latest/?badge=latest
.. image:: https://coveralls.io/repos/github/c0fec0de/anytree/badge.svg
:target: https://coveralls.io/github/c0fec0de/anytree
.. image:: https://readthedocs.org/projects/anytree/badge/?version=stable
:target: https://anytree.readthedocs.io/en/stable
.. image:: https://api.codeclimate.com/v1/badges/e6d325d6fd23a93aab20/maintainability
:target: https://codeclimate.com/github/c0fec0de/anytree/maintainability
:alt: Maintainability
.. image:: https://img.shields.io/pypi/pyversions/anytree.svg
:target: https://pypi.python.org/pypi/anytree
.. image:: https://img.shields.io/badge/code%20style-pep8-brightgreen.svg
:target: https://www.python.org/dev/peps/pep-0008/
.. image:: https://img.shields.io/badge/code%20style-pep257-brightgreen.svg
:target: https://www.python.org/dev/peps/pep-0257/
.. image:: https://img.shields.io/badge/linter-pylint-%231674b1?style=flat
:target: https://www.pylint.org/
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
.. image:: https://img.shields.io/github/contributors/c0fec0de/anytree.svg
:target: https://github.com/c0fec0de/anytree/graphs/contributors/
.. image:: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square
:target: http://makeapullrequest.com
.. image:: https://img.shields.io/github/issues-pr/c0fec0de/anytree.svg
:target: https://github.com/c0fec0de/anytree/pulls
.. image:: https://img.shields.io/github/issues-pr-closed/c0fec0de/anytree.svg
:target: https://github.com/c0fec0de/anytree/pulls?q=is%3Apr+is%3Aclosed
Links
=====
* Documentation_
* PyPI_
* GitHub_
* Changelog_
* Issues_
* Contributors_
* If you enjoy anytree_
.. image:: https://github.com/c0fec0de/anytree/raw/devel/docs/static/buymeacoffee.png
:target: https://www.buymeacoffee.com/1oYX0sw
.. _anytree: https://anytree.readthedocs.io/en/stable/
.. _Documentation: https://anytree.readthedocs.io/en/stable/
.. _PyPI: https://pypi.org/project/anytree
.. _GitHub: https://github.com/c0fec0de/anytree
.. _Changelog: https://github.com/c0fec0de/anytree/releases
.. _Issues: https://github.com/c0fec0de/anytree/issues
.. _Contributors: https://github.com/c0fec0de/anytree/graphs/contributors
.. _Node: https://anytree.readthedocs.io/en/stable/api/anytree.node.html#anytree.node.node.Node
.. _RenderTree: https://anytree.readthedocs.io/en/stable/api/anytree.render.html#anytree.render.RenderTree
.. _UniqueDotExporter: https://anytree.readthedocs.io/en/stable/exporter/dotexporter.html#anytree.exporter.dotexporter.UniqueDotExporter
.. _NodeMixin: https://anytree.readthedocs.io/en/stable/api/anytree.node.html#anytree.node.nodemixin.NodeMixin
.. _Importers: https://anytree.readthedocs.io/en/stable/importer.html
.. _Exporters: https://anytree.readthedocs.io/en/stable/exporter.html
Getting started
---------------
.. _getting_started:
Usage is simple.
**Construction**
>>> from anytree import Node, RenderTree
>>> udo = Node("Udo")
>>> marc = Node("Marc", parent=udo)
>>> lian = Node("Lian", parent=marc)
>>> dan = Node("Dan", parent=udo)
>>> jet = Node("Jet", parent=dan)
>>> jan = Node("Jan", parent=dan)
>>> joe = Node("Joe", parent=dan)
**Node**
>>> print(udo)
Node('/Udo')
>>> print(joe)
Node('/Udo/Dan/Joe')
**Tree**
>>> for pre, fill, node in RenderTree(udo):
... print("%s%s" % (pre, node.name))
Udo
├── Marc
│ └── Lian
└── Dan
├── Jet
├── Jan
└── Joe
For details see Node_ and RenderTree_.
**Visualization**
>>> from anytree.exporter import UniqueDotExporter
>>> # graphviz needs to be installed for the next line!
>>> UniqueDotExporter(udo).to_picture("udo.png")
.. image:: https://anytree.readthedocs.io/en/latest/_images/udo.png
The UniqueDotExporter_ can be started at any node and has various formatting hookups:
>>> UniqueDotExporter(dan,
... nodeattrfunc=lambda node: "fixedsize=true, width=1, height=1, shape=diamond",
... edgeattrfunc=lambda parent, child: "style=bold"
... ).to_picture("dan.png")
.. image:: https://anytree.readthedocs.io/en/latest/_images/dan.png
There are various other Importers_ and Exporters_.
**Manipulation**
A second tree:
>>> mary = Node("Mary")
>>> urs = Node("Urs", parent=mary)
>>> chris = Node("Chris", parent=mary)
>>> marta = Node("Marta", parent=mary)
>>> print(RenderTree(mary))
Node('/Mary')
├── Node('/Mary/Urs')
├── Node('/Mary/Chris')
└── Node('/Mary/Marta')
Append:
>>> udo.parent = mary
>>> print(RenderTree(mary))
Node('/Mary')
├── Node('/Mary/Urs')
├── Node('/Mary/Chris')
├── Node('/Mary/Marta')
└── Node('/Mary/Udo')
├── Node('/Mary/Udo/Marc')
│ └── Node('/Mary/Udo/Marc/Lian')
└── Node('/Mary/Udo/Dan')
├── Node('/Mary/Udo/Dan/Jet')
├── Node('/Mary/Udo/Dan/Jan')
└── Node('/Mary/Udo/Dan/Joe')
Subtree rendering:
>>> print(RenderTree(marc))
Node('/Mary/Udo/Marc')
└── Node('/Mary/Udo/Marc/Lian')
Cut:
>>> dan.parent = None
>>> print(RenderTree(dan))
Node('/Dan')
├── Node('/Dan/Jet')
├── Node('/Dan/Jan')
└── Node('/Dan/Joe')
**Extending any python class to become a tree node**
The entire tree magic is encapsulated by NodeMixin_
add it as base class and the class becomes a tree node:
>>> from anytree import NodeMixin, RenderTree
>>> class MyBaseClass(object): # Just an example of a base class
... foo = 4
>>> class MyClass(MyBaseClass, NodeMixin): # Add Node feature
... def __init__(self, name, length, width, parent=None, children=None):
... super(MyClass, self).__init__()
... self.name = name
... self.length = length
... self.width = width
... self.parent = parent
... if children:
... self.children = children
Just set the `parent` attribute to reflect the tree relation:
>>> my0 = MyClass('my0', 0, 0)
>>> my1 = MyClass('my1', 1, 0, parent=my0)
>>> my2 = MyClass('my2', 0, 2, parent=my0)
>>> for pre, fill, node in RenderTree(my0):
... treestr = u"%s%s" % (pre, node.name)
... print(treestr.ljust(8), node.length, node.width)
my0 0 0
├── my1 1 0
└── my2 0 2
The `children` can be used likewise:
>>> my0 = MyClass('my0', 0, 0, children=[
... MyClass('my1', 1, 0),
... MyClass('my2', 0, 2),
... ])
>>> for pre, fill, node in RenderTree(my0):
... treestr = u"%s%s" % (pre, node.name)
... print(treestr.ljust(8), node.length, node.width)
my0 0 0
├── my1 1 0
└── my2 0 2
Documentation
-------------
Please see the Documentation_ for all details.
Installation
------------
To install the `anytree` module run::
pip install anytree
If you do not have write-permissions to the python installation, try::
pip install anytree --user
Raw data
{
"_id": null,
"home_page": "",
"name": "anytree",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7.2,<4",
"maintainer_email": "",
"keywords": "tree,tree data,treelib,tree walk,tree structure",
"author": "c0fec0de",
"author_email": "c0fec0de@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/f9/44/2dd9c5d0c3befe899738b930aa056e003b1441bfbf34aab8fce90b2b7dea/anytree-2.12.1.tar.gz",
"platform": null,
"description": ".. image:: https://badge.fury.io/py/anytree.svg\n :target: https://badge.fury.io/py/anytree\n\n.. image:: https://img.shields.io/pypi/dm/anytree.svg?label=pypi%20downloads\n :target: https://pypi.python.org/pypi/anytree\n\n.. image:: https://readthedocs.org/projects/anytree/badge/?version=latest\n :target: https://anytree.readthedocs.io/en/latest/?badge=latest\n\n.. image:: https://coveralls.io/repos/github/c0fec0de/anytree/badge.svg\n :target: https://coveralls.io/github/c0fec0de/anytree\n\n.. image:: https://readthedocs.org/projects/anytree/badge/?version=stable\n :target: https://anytree.readthedocs.io/en/stable\n\n.. image:: https://api.codeclimate.com/v1/badges/e6d325d6fd23a93aab20/maintainability\n :target: https://codeclimate.com/github/c0fec0de/anytree/maintainability\n :alt: Maintainability\n\n.. image:: https://img.shields.io/pypi/pyversions/anytree.svg\n :target: https://pypi.python.org/pypi/anytree\n\n.. image:: https://img.shields.io/badge/code%20style-pep8-brightgreen.svg\n :target: https://www.python.org/dev/peps/pep-0008/\n\n.. image:: https://img.shields.io/badge/code%20style-pep257-brightgreen.svg\n :target: https://www.python.org/dev/peps/pep-0257/\n\n.. image:: https://img.shields.io/badge/linter-pylint-%231674b1?style=flat\n :target: https://www.pylint.org/\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n\n.. image:: https://img.shields.io/github/contributors/c0fec0de/anytree.svg\n :target: https://github.com/c0fec0de/anytree/graphs/contributors/\n\n.. image:: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\n :target: http://makeapullrequest.com\n\n.. image:: https://img.shields.io/github/issues-pr/c0fec0de/anytree.svg\n :target: https://github.com/c0fec0de/anytree/pulls\n\n.. image:: https://img.shields.io/github/issues-pr-closed/c0fec0de/anytree.svg\n :target: https://github.com/c0fec0de/anytree/pulls?q=is%3Apr+is%3Aclosed\n\n\nLinks\n=====\n\n* Documentation_\n* PyPI_\n* GitHub_\n* Changelog_\n* Issues_\n* Contributors_\n* If you enjoy anytree_\n\n.. image:: https://github.com/c0fec0de/anytree/raw/devel/docs/static/buymeacoffee.png\n :target: https://www.buymeacoffee.com/1oYX0sw\n\n.. _anytree: https://anytree.readthedocs.io/en/stable/\n.. _Documentation: https://anytree.readthedocs.io/en/stable/\n.. _PyPI: https://pypi.org/project/anytree\n.. _GitHub: https://github.com/c0fec0de/anytree\n.. _Changelog: https://github.com/c0fec0de/anytree/releases\n.. _Issues: https://github.com/c0fec0de/anytree/issues\n.. _Contributors: https://github.com/c0fec0de/anytree/graphs/contributors\n\n.. _Node: https://anytree.readthedocs.io/en/stable/api/anytree.node.html#anytree.node.node.Node\n.. _RenderTree: https://anytree.readthedocs.io/en/stable/api/anytree.render.html#anytree.render.RenderTree\n.. _UniqueDotExporter: https://anytree.readthedocs.io/en/stable/exporter/dotexporter.html#anytree.exporter.dotexporter.UniqueDotExporter\n.. _NodeMixin: https://anytree.readthedocs.io/en/stable/api/anytree.node.html#anytree.node.nodemixin.NodeMixin\n.. _Importers: https://anytree.readthedocs.io/en/stable/importer.html\n.. _Exporters: https://anytree.readthedocs.io/en/stable/exporter.html\n\nGetting started\n---------------\n\n.. _getting_started:\n\nUsage is simple.\n\n**Construction**\n\n>>> from anytree import Node, RenderTree\n>>> udo = Node(\"Udo\")\n>>> marc = Node(\"Marc\", parent=udo)\n>>> lian = Node(\"Lian\", parent=marc)\n>>> dan = Node(\"Dan\", parent=udo)\n>>> jet = Node(\"Jet\", parent=dan)\n>>> jan = Node(\"Jan\", parent=dan)\n>>> joe = Node(\"Joe\", parent=dan)\n\n**Node**\n\n>>> print(udo)\nNode('/Udo')\n>>> print(joe)\nNode('/Udo/Dan/Joe')\n\n**Tree**\n\n>>> for pre, fill, node in RenderTree(udo):\n... print(\"%s%s\" % (pre, node.name))\nUdo\n\u251c\u2500\u2500 Marc\n\u2502 \u2514\u2500\u2500 Lian\n\u2514\u2500\u2500 Dan\n \u251c\u2500\u2500 Jet\n \u251c\u2500\u2500 Jan\n \u2514\u2500\u2500 Joe\n\nFor details see Node_ and RenderTree_.\n\n**Visualization**\n\n>>> from anytree.exporter import UniqueDotExporter\n>>> # graphviz needs to be installed for the next line!\n>>> UniqueDotExporter(udo).to_picture(\"udo.png\")\n\n.. image:: https://anytree.readthedocs.io/en/latest/_images/udo.png\n\nThe UniqueDotExporter_ can be started at any node and has various formatting hookups:\n\n>>> UniqueDotExporter(dan,\n... nodeattrfunc=lambda node: \"fixedsize=true, width=1, height=1, shape=diamond\",\n... edgeattrfunc=lambda parent, child: \"style=bold\"\n... ).to_picture(\"dan.png\")\n\n.. image:: https://anytree.readthedocs.io/en/latest/_images/dan.png\n\nThere are various other Importers_ and Exporters_.\n\n**Manipulation**\n\nA second tree:\n\n>>> mary = Node(\"Mary\")\n>>> urs = Node(\"Urs\", parent=mary)\n>>> chris = Node(\"Chris\", parent=mary)\n>>> marta = Node(\"Marta\", parent=mary)\n>>> print(RenderTree(mary))\nNode('/Mary')\n\u251c\u2500\u2500 Node('/Mary/Urs')\n\u251c\u2500\u2500 Node('/Mary/Chris')\n\u2514\u2500\u2500 Node('/Mary/Marta')\n\nAppend:\n\n>>> udo.parent = mary\n>>> print(RenderTree(mary))\nNode('/Mary')\n\u251c\u2500\u2500 Node('/Mary/Urs')\n\u251c\u2500\u2500 Node('/Mary/Chris')\n\u251c\u2500\u2500 Node('/Mary/Marta')\n\u2514\u2500\u2500 Node('/Mary/Udo')\n \u251c\u2500\u2500 Node('/Mary/Udo/Marc')\n \u2502 \u2514\u2500\u2500 Node('/Mary/Udo/Marc/Lian')\n \u2514\u2500\u2500 Node('/Mary/Udo/Dan')\n \u251c\u2500\u2500 Node('/Mary/Udo/Dan/Jet')\n \u251c\u2500\u2500 Node('/Mary/Udo/Dan/Jan')\n \u2514\u2500\u2500 Node('/Mary/Udo/Dan/Joe')\n\nSubtree rendering:\n\n>>> print(RenderTree(marc))\nNode('/Mary/Udo/Marc')\n\u2514\u2500\u2500 Node('/Mary/Udo/Marc/Lian')\n\nCut:\n\n>>> dan.parent = None\n>>> print(RenderTree(dan))\nNode('/Dan')\n\u251c\u2500\u2500 Node('/Dan/Jet')\n\u251c\u2500\u2500 Node('/Dan/Jan')\n\u2514\u2500\u2500 Node('/Dan/Joe')\n\n**Extending any python class to become a tree node**\n\nThe entire tree magic is encapsulated by NodeMixin_\nadd it as base class and the class becomes a tree node:\n\n>>> from anytree import NodeMixin, RenderTree\n>>> class MyBaseClass(object): # Just an example of a base class\n... foo = 4\n>>> class MyClass(MyBaseClass, NodeMixin): # Add Node feature\n... def __init__(self, name, length, width, parent=None, children=None):\n... super(MyClass, self).__init__()\n... self.name = name\n... self.length = length\n... self.width = width\n... self.parent = parent\n... if children:\n... self.children = children\n\nJust set the `parent` attribute to reflect the tree relation:\n\n>>> my0 = MyClass('my0', 0, 0)\n>>> my1 = MyClass('my1', 1, 0, parent=my0)\n>>> my2 = MyClass('my2', 0, 2, parent=my0)\n\n>>> for pre, fill, node in RenderTree(my0):\n... treestr = u\"%s%s\" % (pre, node.name)\n... print(treestr.ljust(8), node.length, node.width)\nmy0 0 0\n\u251c\u2500\u2500 my1 1 0\n\u2514\u2500\u2500 my2 0 2\n\nThe `children` can be used likewise:\n\n>>> my0 = MyClass('my0', 0, 0, children=[\n... MyClass('my1', 1, 0),\n... MyClass('my2', 0, 2),\n... ])\n\n>>> for pre, fill, node in RenderTree(my0):\n... treestr = u\"%s%s\" % (pre, node.name)\n... print(treestr.ljust(8), node.length, node.width)\nmy0 0 0\n\u251c\u2500\u2500 my1 1 0\n\u2514\u2500\u2500 my2 0 2\n\nDocumentation\n-------------\n\nPlease see the Documentation_ for all details.\n\nInstallation\n------------\n\nTo install the `anytree` module run::\n\n pip install anytree\n\nIf you do not have write-permissions to the python installation, try::\n\n pip install anytree --user\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Powerful and Lightweight Python Tree Data Structure with various plugins",
"version": "2.12.1",
"project_urls": null,
"split_keywords": [
"tree",
"tree data",
"treelib",
"tree walk",
"tree structure"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "6afbff946843e6b55ae9fda84df3964d6c233cd2261dface789f5be02ab79bc5",
"md5": "dae89e11a91c5f9a93b65c096b8d27bd",
"sha256": "5ea9e61caf96db1e5b3d0a914378d2cd83c269dfce1fb8242ce96589fa3382f0"
},
"downloads": -1,
"filename": "anytree-2.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dae89e11a91c5f9a93b65c096b8d27bd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7.2,<4",
"size": 44914,
"upload_time": "2023-11-16T21:53:00",
"upload_time_iso_8601": "2023-11-16T21:53:00.317855Z",
"url": "https://files.pythonhosted.org/packages/6a/fb/ff946843e6b55ae9fda84df3964d6c233cd2261dface789f5be02ab79bc5/anytree-2.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f9442dd9c5d0c3befe899738b930aa056e003b1441bfbf34aab8fce90b2b7dea",
"md5": "7838794202ed2b82711d81895323f367",
"sha256": "244def434ccf31b668ed282954e5d315b4e066c4940b94aff4a7962d85947830"
},
"downloads": -1,
"filename": "anytree-2.12.1.tar.gz",
"has_sig": false,
"md5_digest": "7838794202ed2b82711d81895323f367",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7.2,<4",
"size": 31110,
"upload_time": "2023-11-16T21:53:02",
"upload_time_iso_8601": "2023-11-16T21:53:02.263628Z",
"url": "https://files.pythonhosted.org/packages/f9/44/2dd9c5d0c3befe899738b930aa056e003b1441bfbf34aab8fce90b2b7dea/anytree-2.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-11-16 21:53:02",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "anytree"
}