code: def lookupKerningValue(
      pair,
      kerning,
      groups,
      fallback=0,
      glyphToFirstGroup=None,
      glyphToSecondGroup=None,
  ):
      """
      Note: This expects kerning to be a flat dictionary
      of kerning pairs, not the nested structure used
      in kerning.plist.
  
      >>> groups = {
      ...     "public.kern1.O" : ["O", "D", "Q"],
      ...     "public.kern2.E" : ["E", "F"]
      ... }
      >>> kerning = {
      ...     ("public.kern1.O", "public.kern2.E") : -100,
      ...     ("public.kern1.O", "F") : -200,
      ...     ("D", "F") : -300
      ... }
      >>> lookupKerningValue(("D", "F"), kerning, groups)
      -300
      >>> lookupKerningValue(("O", "F"), kerning, groups)
      -200
      >>> lookupKerningValue(("O", "E"), kerning, groups)
      -100
      >>> lookupKerningValue(("O", "O"), kerning, groups)
      0
      >>> lookupKerningValue(("E", "E"), kerning, groups)
      0
      >>> lookupKerningValue(("E", "O"), kerning, groups)
      0
      >>> lookupKerningValue(("X", "X"), kerning, groups)
      0
      >>> lookupKerningValue(("public.kern1.O", "public.kern2.E"),
      ...     kerning, groups)
      -100
      >>> lookupKerningValue(("public.kern1.O", "F"), kerning, groups)
      -200
      >>> lookupKerningValue(("O", "public.kern2.E"), kerning, groups)
      -100
      >>> lookupKerningValue(("public.kern1.X", "public.kern2.X"), kerning, groups)
      0
      """
      # quickly check to see if the pair is in the kerning dictionary
      if pair in kerning:
          return kerning[pair]
      # create glyph to group mapping
      if glyphToFirstGroup is not None:
          assert glyphToSecondGroup is not None
      if glyphToSecondGroup is not None:
          assert glyphToFirstGroup is not None
      if glyphToFirstGroup is None:
          glyphToFirstGroup = {}
          glyphToSecondGroup = {}
          for group, groupMembers in groups.items():
              if group.startswith("public.kern1."):
                  for glyph in groupMembers:
                      glyphToFirstGroup[glyph] = group
              elif group.startswith("public.kern2."):
                  for glyph in groupMembers:
                      glyphToSecondGroup[glyph] = group
      # get group names and make sure first and second are glyph names
      first, second = pair
      firstGroup = secondGroup = None
      if first.startswith("public.kern1."):
          firstGroup = first
          first = None
      else:
          firstGroup = glyphToFirstGroup.get(first)
      if second.startswith("public.kern2."):
          secondGroup = second
          second = None
      else:
          secondGroup = glyphToSecondGroup.get(second)
      # make an ordered list of pairs to look up
      pairs = [
          (first, second),
          (first, secondGroup),
          (firstGroup, second),
          (firstGroup, secondGroup),
      ]
      # look up the pairs and return any matches
      for pair in pairs:
          if pair in kerning:
              return kerning[pair]
      # use the fallback value
      return fallback
  
label_desc: Use image node_id 1 for calling a global function with example usage: lookupKerningValue(pair, kerning, groups, fallback, glyphToFirstGroup, glyphToSecondGroup) and returns: fallback, kerning, kerning