code: def get_full_name(self, role, name):
          
  
          # An initial '.' indicates a partial name
          if name[0] == '.':
              # Find matches for the partial name in the string
              # containing all full names for this role
              ptrn = r'(?<= )[^,]*' + name + r'(?=,)'
              ml = re.findall(ptrn, self.rolnam[role])
              # Handle cases depending on the number of returned matches,
              # raising an error if exactly one match is not found
              if len(ml) == 0:
                  raise KeyError('name matching %s not found' % name,
                                 'name', len(ml))
              elif len(ml) > 1:
                  raise KeyError('multiple names matching %s found' % name,
                                 'name', len(ml))
              else:
                  return ml[0]
          else:
              # The absence of an initial '.' indicates a full
              # name. Return the name if it is present in the inventory,
              # otherwise raise an error
              try:
                  dom = IntersphinxInventory.roledomain[role]
              except KeyError:
                  raise KeyError('role %s not found' % role, 'role', 0)
              if name in self.inv[dom]:
                  return name
              else:
                  raise KeyError('name %s not found' % name, 'name', 0)
docs: If ``name`` is already the full name of an object, return
          ``name``.  Otherwise, if ``name`` is a partial object name,
          look up the full name and return it.