Skip to main content

package for tree like structure sorted by category with named data

Project description

hierarchical_storage - package for tree like structure sorted by category with named data

This package contains the HierarchicalNode class that defines a recursive structure. Each node can have child nodes distributed among categories. Nodes can also of course store data.

Baisc Use

Instanciation

First, you have to import the HierarchicalNode class.
The __init__ method use the following signature :

# ===================================================
def __init__(self, node_category, name, parent=None):
    """
    Initialization of a HierarchicalNode instance

    :type node_category: str
    :param node_category: the category of the node

    :type name: str
    :param name: the name of the node

    :type parent: NonetType | HierarchicalNode
    :param parent: the parent of this node
    """

You always have to precise a category for a node. Categories are just strings and you create your own categories, their are no imposed one. Here, for your first node, certainly a root node, you can use "ROOT" as a category.
If the notion of category is not usefull for your data structure, just pass an empty string each time.
Ex :

from hierarchical_storage import HierarchicalNode

root_node = HierarchicalNode("ROOT", "My Enyclopedia")

Populate structure

In order to populate your structure, you simply have to create new nodes. When you create a node, you can precise its parent node. The new node will be automatically added to the parent node in the category of the child node.

Ex :

volume_1 = HierarchicalNode("Volume", "Volume 1", parent=root_node)
chapter_1 = HierarchicalNode("Chapter", "Chapter 1", parent=volume_1)

Handle data

Each node can store any data within a personnal dictionnary. You can update this dictionnary with the set_data method.

# ===================================
def set_data(self, data_name, value):
    """
    This method is designed to update or set a data of this node

    :type data_name: str
    :param data_name: the name of the data to update

    :type value: any
    :param value: the data to update or set
    """

As you can see no speific type is expected for a data, just see it as a simple dictionnary.
The method is very easy to use.

Ex :

root_node.set_data("language", "English")
volume_1.set_data("title", "Mathematics")
chapter_1.set_data("title", "Early mathematics")

Getting data is performed the same way through the 'get_data' method.

# ============================
def get_data(self, data_name):
    """
    This method is designed to get a data from this node

    :type data_name: str
    :param data_name: the name of the data to get

    :rtype: any
    :return: the desired data
    """

Ex :

root_node.get_data("language")
>>> English

You can also remove an entree from the data with the remove_data method :

# ===============================
def remove_data(self, data_name):
    """
    This method is designed to remove a data from this node

    :type data_name: str
    :param data_name: the name of the data to remove
    """

Ex :

root_node.remove_data("language")

To know the different keys of the data of a node you have two methods at your disposal : get_data_names_iterator and get_data_names. The first one returns an iterator over the names of the data, the second one returns the list of names of the data.

# ================================
def get_data_names_iterator(self):
    """
    This method is designed to get an iterator over the names of the data of this node

    :rtype: Generator[str]
    :return: an iterator over the names of the data of this node
    """

# =======================
def get_data_names(self):
    """
    This method is designed to get the list of the names of the data of this node

    :rtype: list[str]
    :return: the list of the names of the data of this node
    """

Finally if necessary you can get a copy of the data of the node with the get_data_dict method.

# ======================
def get_data_dict(self):
    """
    This method is designed to get the dictionnary of the data of the node
    Warning : Modifying the returned dictionnary won't modiy the dictionnary of the instance, yet modifying the data itself will

    :rtype: dict[str, any]
    :return: the dictionnary of the data of the node
    """

Modify the hierarchy

If you made a mistake when you created your structure, you can still change the hierarchy of data with the three following methods:

# ====================================
def set_node_category(self, category):
    """
    This method is designed to update the category of the node

    :type category: str
    :param category: the new category of the node
    """

# ===============================
def set_parent(self, new_parent):
    """
    This method is designed to set the parent of this HierarchicalNode

    :type new_parent: NoneType | HierarchicalNode
    :param new_parent: the new parent of this HierarchicalNode
    """

# =========================
def add_child(self, child):
    """
    This method is designed to add a child node to this node

    :type child: HierarchicalNode
    :param child: The child node to add to this node
    """

# ============================
def remove_child(self, child):
    """
    This method is designed to remove a child node from this node

    :type child: HierarchicalNode
    :param child: the child node to remove from this node
    """

Walk the hierarchy

First you can always get the parent node of a node with the get_parent method :

# ===================
def get_parent(self):
    """
    This method is designed to get the parent of this node

    :rtype: NoneType | HierarchicalNode
    :return: The parent of this node
    """

You can check the diffents categories of a node with the following methods :

# ================================
def get_categories_iterator(self):
    """
    This method is designed to get an iterator over the categories of this node

    :rtype: Generator[str]
    :return: an iterator over the categories of this node
    """

# =======================
def get_categories(self):
    """
    This method is designed to get the list of categories of this node

    :rtype: list[str]
    :return: the list of categories of this node
    """

# ==============================
def get_sorted_categories(self):
    """
    This method is designed to get the list of categories of this node ordered by name

    :rtype: list[str]
    :return: the list of categories of this node ordered by name
    """

You can then get the different child nodes of a category with these methods :

# ==========================================================
def get_children_in_category_iterator(self, child_category):
    """
    This method is designed to get an iterator over the children within a category for this node

    :type child_category: str
    :param child_category: the inspected category

    :rtype: Generator[HierarchicalNode]
    :return: an iterator over the children within the desired category for this node
    """

# =================================================
def get_children_in_category(self, child_category):
    """
    This method is designed to get the NamedSequence of children within a category for this node
    Warning : modifying the result NamedSequence won't moddify this instance, yet modifying the contained nodes will

    :type child_category: str
    :param child_category: the inspected category

    :rtype: NamedSequence[HierarchicalNode]
    :return: the NamedSequence of children within the desired category for this node
    """

# ========================================================
def get_sorted_children_in_category(self, child_category):
    """
    This method is designed to get the NamedSequence of children within a category for this node, ordered by name
    Warning : modifying the result NamedSequence won't moddify this instance, yet modifying the contained nodes will

    :type child_category: str
    :param child_category: the inspected category

    :rtype: NamedSequence[HierarchicalNode]
    :return: the NamedSequence of children within the desired category for this node, ordered by name
    """

Checking the structure

If you want to check your structure just apply str() to any instance. you will get a string depicting the whole hierarchy. This string does not contains the data. Only node names and categories.

Project details


Release history Release notifications | RSS feed

This version

1.0

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

hierarchical_storage-1.0-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file hierarchical_storage-1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for hierarchical_storage-1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 63ab8a4325ef2e7761f72e16dd9920a291c792659fa6758f6a860f96d802af58
MD5 48641c374da1486de86dc71568a811bc
BLAKE2b-256 9b22b90b0b2b6f4441230a7e91ba90ec75226f7c5cd1b36f2114bb0d35403b90

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