a
    7aI                     @   s@   d Z ddlZddlmZmZmZ ddlmZ dd Zdd	 Z	dS )
z&Useful decorators for Traitlets users.    N)	Signature	Parameter	signature   )	Undefinedc                 C   s   | t krtjS | S )z:Get default argument value, given the trait default value.)r   r   empty)value r	   9lib/python3.9/site-packages/traitlets/utils/decorators.py_get_default
   s    r   c           
         s&  dd |    D }t| j}t|j g }d}g }d}|jD ]r}t|j| }|jtj	u sl|jtj
u rx|| q@|jtju r|}q@|jtju r|| q@|jtju r@|}q@|du rtd| g }	|	|dd 7 }	|dur|	| |	|7 }	|	 fdd|D 7 }	|	| t|	| _| S )zYReturn a decorated class with a constructor signature that contain Trait names as kwargs.c                 S   s(   g | ] \}}| d s|t|jfqS )_)
startswithr   Zdefault_value).0namer   r	   r	   r
   
<listcomp>   s   
z(signature_has_traits.<locals>.<listcomp>NznThe {} constructor does not take **kwargs, which means that the signature can not be expanded with trait names   c                    s(   g | ] \}}| vrt |t j|d qS ))kinddefault)r   KEYWORD_ONLY)r   r   r   Zold_parameter_namesr	   r
   r   E   s   )Zclass_traitsitemsr   __init__list
parameterscopyr   r   ZPOSITIONAL_ONLYZPOSITIONAL_OR_KEYWORDappendZVAR_POSITIONALr   ZVAR_KEYWORDRuntimeErrorformatr   Z__signature__)
clsZtraitsZold_signatureZold_positional_parametersZold_var_positional_parameterZold_keyword_only_parametersZold_var_keyword_parameterZparameter_nameZ	parameterZnew_parametersr	   r   r
   signature_has_traits   sH    






r   )
__doc__r   inspectr   r   r   Z	traitletsr   r   r   r	   r	   r	   r
   <module>   s
   