code: def param(cls, *values, **kwargs):
      marks = kwargs.pop("marks", ())
      if isinstance(marks, MarkDecorator):
          marks = (marks,)
      else:
          assert isinstance(marks, (tuple, list, set))
  
      id_ = kwargs.pop("id", None)
      if id_ is not None:
          if not isinstance(id_, six.string_types):
              raise TypeError(
                  "Expected id to be a string, got {}: {!r}".format(
                      type(id_), id_
                  )
              )
          id_ = ascii_escaped(id_)
  
      if kwargs:
          warnings.warn(
              PYTEST_PARAM_UNKNOWN_KWARGS.format(args=sorted(kwargs)),
              stacklevel=3,
          )
      return cls(values, marks, id_)
  
imports: import inspect
  import warnings
  from collections import namedtuple
  from operator import attrgetter
  import attr
  import six
  from ..compat import ascii_escaped
  from ..compat import ATTRS_EQ_FIELD
  from ..compat import getfslineno
  from ..compat import MappingMixin
  from ..compat import NOTSET
  from _pytest.deprecated import PYTEST_PARAM_UNKNOWN_KWARGS
  from _pytest.outcomes import fail
  from _pytest.warning_types import PytestUnknownMarkWarning
label_desc: Use image node_id 1 for calling the ParameterSet obj's underlying member method code with example usage: obj.param(cls) and returns: cls