U
    /e                     @   s|   d Z ddlZddlmZmZmZ ddlmZmZm	Z	 ddl
mZmZ eeddd	Ze	d
edZee ee dddZdS )z&Useful decorators for Traitlets users.    N)	Parameter	Signature	signature)AnyTypeTypeVar   )	HasTraits	Undefined)valuereturnc                 C   s   | t krtjS | S )z:Get default argument value, given the trait default value.)r
   r   empty)r    r   >/tmp/pip-unpacked-wheel-wtrfb4af/traitlets/utils/decorators.py_get_default
   s    r   T)bound)clsr   c           
         s&  dd |    D }t| j}t|j g }d}g }d}|jD ]r}t|j| }|jtj	ksl|jtj
krx|| q@|jtjkr|}q@|jtjkr|| q@|jtjkr@|}q@|dkrtd| g }	|	|dd 7 }	|dk	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   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 | ] \}}| krt |t j|d qS ))kinddefault)r   KEYWORD_ONLY)r   r   r   Zold_parameter_namesr   r   r   L   s   )Zclass_traitsitemsr   __init__list
parameterscopyr   r   POSITIONAL_ONLYPOSITIONAL_OR_KEYWORDappendVAR_POSITIONALr   VAR_KEYWORDRuntimeErrorformatr   __signature__)
r   Z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   sN    








r,   )__doc__r#   inspectr   r   r   typingr   r   r   Z	traitletsr	   r
   r   r   r,   r   r   r   r   <module>   s   