'Return an iterator over the edges.
edges(self, nbunch=None, data=False, keys=False, default=None)
Edges are returned as tuples with optional data and keys
in the order (node, neighbor, key, data).
Parameters
nbunch : iterable container, optional (default= all nodes)
A container of nodes.  The container will be iterated
through once.
data : string or bool, optional (default=False)
The edge attribute returned in 3-tuple (u, v, ddict[data]).
If True, return edge attribute dict in 3-tuple (u, v, ddict).
If False, return 2-tuple (u, v).
default : value, optional (default=None)
Value used for edges that dont have the requested attribute.
Only relevant if data is not True or False.
keys : bool, optional (default=False)
If True, return edge keys with each edge.
Returns
edge : iterator
An iterator over (u, v), (u, v, d) or (u, v, key, d) edge tuples
Notes
Nodes in nbunch that are not in the graph will be (quietly) ignored.
For directed graphs this returns the out-edges.
Examples
>>> G = nx.MultiGraph()   # or MultiDiGraph
>>> nx.add_path(G, [0, 1, 2])
>>> key = G.add_edge(2, 3, weight=5)
>>> [e for e in G.edges()]
[(0, 1), (1, 2), (2, 3)]
>>> list(G.edges(data=True)) # default data is {} (empty dict)
[(0, 1, {}), (1, 2, {}), (2, 3, {\'weight\': 5})]
>>> list(G.edges(data=\'weight\', default=1))
[(0, 1, 1), (1, 2, 1), (2, 3, 5)]
>>> list(G.edges(keys=True)) # default keys are integers
[(0, 1, 0), (1, 2, 0), (2, 3, 0)]
>>> list(G.edges(data=True, keys=True)) # default keys are integers
[(0, 1, 0, {}), (1, 2, 0, {}), (2, 3, 0, {\'weight\': 5})]
>>> list(G.edges(data=\'weight\', default=1, keys=True))
[(0, 1, 0, 1), (1, 2, 0, 1), (2, 3, 0, 5)]
>>> list(G.edges([0, 3]))
[(0, 1), (3, 2)]
>>> list(G.edges(0))
[(0, 1)]'

@property
def edges(self):

    self.__dict__['edges'] = edges = MultiEdgeView(self)
    return edges
