code: def props(obj, required_args=None, **kwargs):
      
      pr = get_obj_attrs(obj)
      pr.update(kwargs)
  
      if required_args is None:
          required_args = []
  
      # check that required args are given
      missing = set(required_args) - set(pr.keys())
      if any(missing):
          raise ValueError("Please provide {}".format(', '.join(missing)))
  
      # Get the parameters to generate the waveform
      # Note that keyword arguments override values in the template object
      input_params = default_args.copy()
      input_params.update(pr)
  
      return input_params
docs: Return a dictionary built from the combination of defaults, kwargs,
      and the attributes of the given object.