code: def get_parameter_spec(self):
      from fate.components.core.params import Parameter
      from fate.components.core.spec.component import ParameterSpec
  
      default = self.default if self.default is not ... else None
      if not typing.get_origin(self.type) and issubclass(
          self.type, Parameter
      ):  # recommended
          type_name = type(self.type).__name__
          if (schema := self.type.schema()) != NotImplemented:
              type_meta = schema
          else:
              type_meta = pydantic.schema_of(self.type, title=type_name)
      else:
          type_name = getattr(self.type, "__name__", None)
          if type_name is None:
              type_name = str(self.type)
          type_meta = pydantic.schema_of(self.type, title=type_name)
          if self.default is not ...:
              type_meta["default"] = self.default
          type_meta["description"] = self.desc
  
      return ParameterSpec(
          type=type_name,
          type_meta=type_meta,
          default=default,
          optional=self.optional,
          description=self.desc,
      )
  
imports: import typing
  from typing import Dict, TypeVar
  import pydantic
label_desc: Use image node_id 4 for calling the ParameterDescribe obj's underlying member method code with example usage: obj.get_parameter_spec() and returns: ParameterSpec