docs: def expand(self, *args, **kwargs):
          """Expands the template with the given data dictionary, returning a string.
  
      This is a small wrapper around execute(), and is the most convenient
      interface.
  
      Args:
        data_dict: The JSON data dictionary.  Like the builtin dict() constructor,
            it can take a single dictionary as a positional argument, or arbitrary
            keyword arguments.
        trace: Trace object for debugging
        style: Template instance to be treated as a style for this template (the
            "outside")
  
      Returns:
        The return value could be a str() or unicode() instance, depending on the
        the type of the template string passed in, and what the types the strings
        in the dictionary are.
      """
          if args:
              if len(args) == 1:
                  data_dict = args[0]
                  trace = kwargs.get('trace')
                  style = kwargs.get('style')
              else:
                  raise TypeError(
                      'expand() only takes 1 positional argument (got %s)' % args)
          else:
              data_dict = kwargs
              trace = None  # Can't use trace= with the kwargs style
              style = None
          
          tokens = []
          group = _MakeGroupFromRootSection(self._program, self.undefined_str)
          if style:
              style.execute(data_dict, tokens.append, group=group,
                            trace=trace)
          else:
              # Needs a group to reference its OWN {.define}s
              self.execute(data_dict, tokens.append, group=group,
                           trace=trace)
          
          return JoinTokens(tokens)