code: def tensor_space(shape, dtype=None, impl='numpy', **kwargs):
      
      tspace_cls = tensor_space_impl(impl)
  
      if dtype is None:
          dtype = tspace_cls.default_dtype()
  
      # Use args by keyword since the constructor may take other arguments
      # by position
      return tspace_cls(shape=shape, dtype=dtype, **kwargs)
docs: Return a tensor space with arbitrary scalar data type.
  
      Parameters
      ----------
      shape : positive int or sequence of positive ints
          Number of entries per axis for elements in this space. A
          single integer results in a space with 1 axis.
      dtype : optional
          Data type of each element. Can be provided in any way the
          `numpy.dtype` function understands, e.g. as built-in type or
          as a string.
          For ``None``, the `TensorSpace.default_dtype` of the
          created space is used.
      impl : str, optional
          Impmlementation back-end for the space. See
          `odl.space.entry_points.tensor_space_impl_names` for available
          options.
      kwargs :
          Extra keyword arguments passed to the space constructor.
  
      Returns
      -------
      space : `TensorSpace`
  
      Examples
      --------
      Space of 3-tuples with ``uint64`` entries (although not strictly a
      vector space):
  
      >>> odl.tensor_space(3, dtype='uint64')
      tensor_space(3, dtype='uint64')
  
      2x3 tensors with same data type:
  
      >>> odl.tensor_space((2, 3), dtype='uint64')
      tensor_space((2, 3), dtype='uint64')
  
      The default data type depends on the implementation. For
      ``impl='numpy'``, it is ``'float64'``:
  
      >>> ts = odl.tensor_space((2, 3))
      >>> ts
      rn((2, 3))
      >>> ts.dtype
      dtype('float64')
  
      See Also
      --------
      rn, cn : Constructors for real and complex spaces