class_docstr: A base class for simple property types.
  
  Subclasses should define a class attribute ``_underlying_type`` that is
  a tuple of acceptable type values for the property.
  
  Example:
  
      A trivial version of a ``Float`` property might look like:
  
      .. code-block:: python
  
          class Float(PrimitiveProperty):
              _underlying_type = (numbers.Real,)
class_docstr_tok: ["A","base","class","for","simple","property","types",".","Subclasses","should","define","a","class","attribute","``","_underlying_type","``","that","is","a","tuple","of","acceptable","type","values","for","the","property",".","Example",":","A","trivial","version","of","a","``","Float","``","property","might","look","like",":","..","code-block",":",":","python","class","Float","(","PrimitiveProperty",")",":","_underlying_type","=","(","numbers.Real",",",")"]
code: def validate(self, value: Any, detail: bool = True) -> None:
      super().validate(value, detail)
  
      if isinstance(value, self._underlying_type):
          return
  
      if not detail:
          raise ValueError("")
  
      expected_type = nice_join(
          [cls.__name__ for cls in self._underlying_type]
      )
      msg = f"expected a value of type {expected_type}, got {value} of type {type(value).__name__}"
      raise ValueError(msg)
  
imports: from __future__ import annotations
  import logging
  from copy import copy
  from typing import TYPE_CHECKING, Any, Callable, ClassVar, TypeVar, Union
  from ...util.dependencies import uses_pandas
  from ...util.strings import nice_join
  from ..has_props import HasProps
  from ._sphinx import property_link, register_type_link, type_link
  from .descriptor_factory import PropertyDescriptorFactory
  from .descriptors import PropertyDescriptor
  from .singletons import Intrinsic, IntrinsicType, Undefined, UndefinedType
label_desc: Use image node_id 1 for calling the PrimitiveProperty obj's underlying member method code with example usage: obj.validate(value, detail) without return types