When a static type checker encounters a call to ``reveal_type()``,
    it will emit the inferred type of the argument::
        x: int = 1
        reveal_type(x)
    Running a static type checker (e.g., mypy) on this example
    will produce output similar to 'Revealed type is "builtins.int"'.
    At runtime, the function prints the runtime type of the
    argument and returns it unchanged.
    """
    print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr)
    return obj
def dataclass_transform(
    *,
    eq_default: bool = True,
    order_default: bool = False,
    kw_only_default: bool = False,
    field_specifiers: tuple[type[Any] | Callable[..., Any], ...] = (),
    **kwargs: Any,
) -> Callable[[T], T]:
    """Decorator to mark an object as providing dataclass-like behaviour.
    The decorator can be applied to a function, class, or metaclass.
    Example usage with a decorator function::
        T = TypeVar("T")
        @dataclass_transform()
        def create_model(cls: type[T]) -> type[T]:
            ...
            return cls
        @create_model
        class CustomerModel:
            id: int
            name: str
    On a base class::
        @dataclass_transform()
        class ModelBase: ...
        class CustomerModel(ModelBase):
            id: int
            name: str
    On a metaclass::
        @dataclass_transform()
        class ModelMeta(type): ...
        class ModelBase(metaclass=ModelMeta): ...
        class CustomerModel(ModelBase):
            id: int
            name: str