original_docstring:  The decorator is used to allow us to specify the keys of the
          dict that the task returns.
  
          This is used only to signal to the user the inputs and outputs
          of a task, and deduce what arguments are required for a chain.
      
docstring: The decorator is used to allow us to specify the keys of the
  dict that the task returns.
  
  This is used only to signal to the user the inputs and outputs
  of a task, and deduce what arguments are required for a chain.
docstring_tokens: The decorator is used to allow us to specify the keys of the dict that the task returns . This is used only to signal to the user the inputs and outputs of a task and deduce what arguments are required for a chain .
code: def returns(*args):
      """ The decorator is used to allow us to specify the keys of the
          dict that the task returns.
  
          This is used only to signal to the user the inputs and outputs
          of a task, and deduce what arguments are required for a chain.
      """
      if not args or len(args) != len(set(args)):
          raise ReturnsCodingException("@returns cannot contain duplicate keys")
  
      def decorator(func):
          if type(func) is PromiseProxy:
              raise ReturnsCodingException("@returns must be applied to a function (before @app.task)")
  
          # Store the arguments of the decorator as a function attribute
          undecorated = func
          while hasattr(undecorated, '__wrapped__'):
              undecorated = undecorated.__wrapped__
          undecorated._decorated_return_keys = args
  
          # Return a dictionary mapping the tuple returned by the original function
          # to the keys specified by the arguments to the @returns decorator
          @wraps(func)
          def returns_wrapper(*orig_args, **orig_kwargs) -> dict:
              result = func(*orig_args, **orig_kwargs)
              return FireXTask.convert_returns_to_dict(undecorated._decorated_return_keys, result)
  
          return returns_wrapper
  
      return decorator
code_tokens: def returns ( * args ) : if not args or len ( args ) != len ( set ( args ) ) : raise ReturnsCodingException ( "@returns cannot contain duplicate keys" ) def decorator ( func ) : if type ( func ) is PromiseProxy : raise ReturnsCodingException ( "@returns must be applied to a function (before @app.task)" ) undecorated = func while hasattr ( undecorated , '__wrapped__' ) : undecorated = undecorated . __wrapped__ undecorated . _decorated_return_keys = args @ wraps ( func ) def returns_wrapper ( * orig_args , ** orig_kwargs ) -> dict : result = func ( * orig_args , ** orig_kwargs ) return FireXTask . convert_returns_to_dict ( undecorated . _decorated_return_keys , result ) return returns_wrapper return decorator
short_docstring: The decorator is used to allow us to specify the keys of the
  dict that the task returns.
short_docstring_tokens: The decorator is used to allow us to specify the keys of the dict that the task returns .
comment: """ The decorator is used to allow us to specify the keys of the
          dict that the task returns.
  
          This is used only to signal to the user the inputs and outputs
          of a task, and deduce what arguments are required for a chain.
      """$SEP$# Store the arguments of the decorator as a function attribute$SEP$# Return a dictionary mapping the tuple returned by the original function$SEP$# to the keys specified by the arguments to the @returns decorator