'Initialize a graph with edges, name, graph attributes.
Parameters
data : input graph
Data to initialize graph.  If data=None (default) an empty
graph is created.  The data can be an edge list, or any
NetworkX graph object.  If the corresponding optional Python
packages are installed the data can also be a NumPy matrix
or 2d ndarray, a SciPy sparse matrix, or a PyGraphviz graph.
name : string, optional (default=\'\')
An optional name for the graph.
attr : keyword arguments, optional (default= no attributes)
Attributes to add to graph as key=value pairs.
See Also
convert
Examples
>>> G = nx.Graph()  # or DiGraph, MultiGraph, MultiDiGraph, etc
>>> G = nx.Graph(name=\'my graph\')
>>> e = [(1, 2), (2, 3), (3, 4)]  # list of edges
>>> G = nx.Graph(e)
Arbitrary graph attribute pairs (key=value) may be assigned
>>> G = nx.Graph(e, day="Friday")
>>> G.graph
{\'day\': \'Friday\'}'

def __init__(self, data=None, **attr):

    self.node_dict_factory = ndf = self.node_dict_factory
    self.adjlist_outer_dict_factory = self.adjlist_outer_dict_factory
    self.adjlist_inner_dict_factory = self.adjlist_inner_dict_factory
    self.edge_attr_dict_factory = self.edge_attr_dict_factory
    self.graph = {}
    self._node = ndf()
    self._adj = self.adjlist_outer_dict_factory()
    if (data is not None):
        convert.to_networkx_graph(data, create_using=self)
    self.graph.update(attr)
