code: def key_to_scan_codes(key, error_if_missing=True):
      
      if _is_number(key):
          return (key,)
      elif _is_list(key):
          return sum((key_to_scan_codes(i) for i in key), ())
      elif not _is_str(key):
          raise ValueError('Unexpected key type ' + str(type(key)) + ', value (' + repr(key) + ')')
  
      normalized = normalize_name(key)
      if normalized in sided_modifiers:
          left_scan_codes = key_to_scan_codes('left ' + normalized, False)
          right_scan_codes = key_to_scan_codes('right ' + normalized, False)
          return left_scan_codes + tuple(c for c in right_scan_codes if c not in left_scan_codes)
  
      try:
          # Put items in ordered dict to remove duplicates.
          t = tuple(_collections.OrderedDict((scan_code, True) for scan_code, modifier in _os_keyboard.map_name(normalized)))
          e = None
      except (KeyError, ValueError) as exception:
          t = ()
          e = exception
  
      if not t and error_if_missing:
          raise ValueError('Key {} is not mapped to any known key.'.format(repr(key)), e)
      else:
          return t
docs: Returns a list of scan codes associated with this key (name or scan code).