code: def cartesian_args(args, listargs, dictargs):
      
      ils = {k: [v, ] for k, v in args.items()}
      ils.update(listargs)
      ils.update({k: v.values() for k, v in dictargs.items()})
      ols = listargs.copy()
      ols.update({k: v.keys() for k, v in dictargs.items()})
      return cartesian_lists(ils), cartesian_lists(ols)
docs: Compute a list of inputs and outputs for a function
      with kw arguments.
  
      args: dict
        fixed arguments, e.g. {'x': 3}, then x=3 for all inputs
      listargs: dict
          arguments specified as a list; then the inputs
          should be the Cartesian products of these lists
      dictargs: dict
          same as above, except the key will be used in the output
          (see module doc for more explanation)