docs: def get_tokens(self, tokenizer: Tokenizer) -> List[Token]:
          """
          Tokenize this Extractable.
  
          If the value is a string, it returns the tokenized version of the string. Else, convert to string with
          get_string method
  
          As it is common to need the same tokens for multiple extractors, the Extractable should cache the
          tokenize results, keyed by segment and tokenizer so that given the same segment and tokenizer,
          the same results are returned. If the same segment is given, but different tokenizer, the different
          results are cached separately.
  
          Args:
              tokenizer (Tokenizer)
  
          Returns: a sequence of tokens.
          """
  
          if (self, tokenizer) in self.tokenize_results:
              return self.tokenize_results[(self, tokenizer)]
          else:
              segment_value_for_tokenize = self.get_string()
              tokens = tokenizer.tokenize(segment_value_for_tokenize)
              self.tokenize_results[(self, tokenizer)] = tokens
              return tokens