code: def getNodeDegrees(grph, weightString = "weight", strictMode = False,  returnType = int, edgeType = 'bi'):
      
      ndsDict = {}
      for nd in grph.nodes():
          ndsDict[nd] = returnType(0)
      for e in grph.edges(data = True):
          if weightString:
              try:
                  edgVal = returnType(e[2][weightString])
              except KeyError:
                  if strictMode:
                      raise KeyError("The edge from " + str(e[0]) + " to " + str(e[1]) + " does not have the attribute: '" + str(weightString) + "'")
                  else:
                      edgVal = returnType(1)
          else:
              edgVal = returnType(1)
          if edgeType == 'bi':
              ndsDict[e[0]] += edgVal
              ndsDict[e[1]] += edgVal
          elif edgeType == 'in':
              ndsDict[e[1]] += edgVal
          elif edgeType == 'out':
              ndsDict[e[0]] += edgVal
          else:
              raise ValueError("edgeType must be 'bi', 'in', or 'out'")
      return ndsDict
docs: Retunrs a dictionary of nodes to their degrees, the degree is determined by adding the weight of edge with the weight being the string weightString that gives the name of the attribute of each edge containng thier weight. The Weights are then converted to the type returnType. If weightString is give as False instead each edge is counted as 1.
  
      edgeType, takes in one of three strings: 'bi', 'in', 'out'. 'bi' means both nodes on the edge count it, 'out' mans only the one the edge comes form counts it and 'in' means only the node the edge goes to counts it. 'bi' is the default. Use only on directional graphs as otherwise the selected nodes is random.