code: def variabletuple(typename, variables, *args, **kwargs):
      
      def _asdict(self):
          return OrderedDict(zip(variables, self))
  
      field_names = [var.name for var in variables]
      named = namedtuple(typename, field_names, *args, **kwargs)
      named._asdict = _asdict
      return named
docs: Create a :func:`~collections.namedtuple` using :class:`~symfit.core.argument.Variable`'s
      whoses names will be used as `field_names`.
  
      The main reason for using this object is the `_asdict()` method: whereas a
      ``namedtuple`` initiates such an :class:`collections.OrderedDict` with the
      ``field_names`` as keys, this object returns a
      :class:`collections.OrderedDict` which immediately has the ``Variable``
      objects as keys.
  
      Example::
  
          >>> x = Variable('x')
          >>> Result = variabletuple('Result', [x])
          >>> res = Result(5.0)
          >>> res._asdict()
          OrderedDict((x, 5.0))
  
      :param typename: Name of the `variabletuple`.
      :param variables: List of :class:`~symfit.core.argument.Variable`, to be used
          as `field_names`
      :param args: See :func:`~collections.namedtuple`
      :param kwargs: See :func:`~collections.namedtuple`
      :return: Type ``typename``