code: def __get_params(self):
      func_type = type(self.func)
  
      if func_type == type:
          init_func = cast(object, self.func).__init__
          spec: inspect.Signature = inspect.signature(init_func)
          params: List[inspect.Parameter] = list(
              spec.parameters.values()
          )
          if len(params) == 0:
              raise ConfigsError(
                  f"Not a valid config function {self.config_names}",
                  self.func,
              )
          if params[0].kind != inspect.Parameter.POSITIONAL_OR_KEYWORD:
              raise ConfigsError(
                  f"Not a valid config function {self.config_names}",
                  self.func,
              )
          if params[0].name != "self":
              raise ConfigsError(
                  f"Not a valid config function {self.config_names}",
                  self.func,
              )
          return params[1:]
      else:
          spec: inspect.Signature = inspect.signature(self.func)
          params: List[inspect.Parameter] = list(
              spec.parameters.values()
          )
          return params
  
file_path: labml/client/labml/internal/configs/config_function.py
imports: import inspect
  import warnings
  from enum import Enum
  from typing import List, Callable, cast, Union, Optional
  from typing import TYPE_CHECKING
  from .config_item import ConfigItem
  from .utils import get_config_names
  from ...utils.errors import ConfigsError
label_desc: Use image node_id 3 for calling the ConfigFunction obj's underlying member method code with example usage: obj.__get_params() and returns: params, params