Skip to content

a-r-j/graphtype

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

graphtype

Type hinting for networkx Graphs

Installation

pip install graphtype

Usage

There are two parts in graphtype: the type-hinting part, and the validation. You can use type-hinting with the provided class to indicate attributes graphs should possess, and the validation decorator to additionally ensure the format is respected in every function call.

Type-Hinting Graph

from graphtype import Graph

def do_something_to_graph(g: Graph)
    pass

Type-Hinting Graph Attributes GraphData

from graphtype import Graph, GraphData


def do_something_to_graph(g: Graph[GraphData["name"]])
    pass

# The graph must have a "name" attribute

def do_something_to_graph(g: Graph[GraphData["name": str]])
    pass

# type(g.graph["name"]) == str must be True

Type-Hinting Node Attributes NodeData

from graphtype import Graph, NodeData

def do_something_to_graph(g: Graph[NodeData["feature"]])
    pass

# Each node must have a "feature" attribute

def do_something_to_graph(g: Graph[NodeData["feature": np.ndarray]])
    pass

# for n, d in g.nodes(data=True):
#   type(d["feature"]) == np.ndarray must be True

Type-Hinting Edge Attributes EdgeData

from graphtype import Graph, EdgeData

def do_something_to_graph(g: Graph[EdgeData["feature"]])
    pass

# Each edge must have a "feature" attribute

def do_something_to_graph(g: Graph[EdgeData["feature": pd.DataFrame]])
    pass

# for u, v, d in g.edges(data=True):
#   type(d["feature"]) == pd.DataFrame must be True

Enforcing: @validate

The @validate decorator ensures that input Graphs have the right format when the function is called, otherwise raises TypeError.

@validate
def func(g: Graph[NodeData["feature1": pd.DataFrame, "feature2": int],
                  EdgeData["length": float, "counts": np.ndarray],
                  GraphData["name": str]],
         h: Graph[NodeData["feature1": pd.DataFrame, "feature2": int]],
         ):
    pass

This package is heavily inspired by Dataenforce.