[docs]defcomponent(function:Callable[...,ComponentType|VdomDict|str|None],)->Callable[...,Component]:"""A decorator for defining a new component. Parameters: function: The component's :meth:`reactpy.core.proto.ComponentType.render` function. """sig=inspect.signature(function)if"key"insig.parametersandsig.parameters["key"].kindin(inspect.Parameter.KEYWORD_ONLY,inspect.Parameter.POSITIONAL_OR_KEYWORD,):msg=f"Component render function {function} uses reserved parameter 'key'"raiseTypeError(msg)@wraps(function)defconstructor(*args:Any,key:Any|None=None,**kwargs:Any)->Component:returnComponent(function,key,args,kwargs,sig)returnconstructor
[docs]classComponent:"""An object for rending component models."""__slots__="__weakref__","_func","_args","_kwargs","_sig","key","type"def__init__(self,function:Callable[...,ComponentType|VdomDict|str|None],key:Any|None,args:tuple[Any,...],kwargs:dict[str,Any],sig:inspect.Signature,)->None:self.key=keyself.type=functionself._args=argsself._kwargs=kwargsself._sig=sigdefrender(self)->ComponentType|VdomDict|str|None:returnself.type(*self._args,**self._kwargs)def__repr__(self)->str:try:args=self._sig.bind(*self._args,**self._kwargs).argumentsexceptTypeError:returnf"{self.type.__name__}(...)"else:items=", ".join(f"{k}={v!r}"fork,vinargs.items())ifitems:returnf"{self.type.__name__}({id(self):02x}, {items})"else:returnf"{self.type.__name__}({id(self):02x})"