U
    Ób‡h$  ã                   @   sx   d Z ddlZddlZddlZddlmZ ejedœdd„Zejejdœdd	„Z	ejedœd
d„Z
ejeedœdd„ZdS )z%Code related to handling annotations.é    N)Úisclass)ÚvalueÚreturnc                 C   s    t jdk r| tdƒkS | tjkS )z'Check if the given value is a NoneType.©é   é
   N)ÚsysÚversion_infoÚtypeÚtypesZNoneType)r   © r   ú</tmp/pip-unpacked-wheel-kcem4wq5/celery/utils/annotations.pyÚis_none_type	   s    
r   )Ú
annotationr   c                 C   sv   t  | ¡}|t jkr,tjdkr,|tjkr,dS t  | ¡}t|ƒdkrFdS t	dd„ |D ƒƒ}t
dd„ |D ƒƒ}|rr|S dS )zWGet the argument from an Optional[...] annotation, or None if it is no such annotation.r   Né   c                 s   s   | ]}t |ƒV  qd S ©N©r   ©Ú.0Úargr   r   r   Ú	<genexpr>   s     z#get_optional_arg.<locals>.<genexpr>c                 s   s   | ]}t |ƒs|V  qd S r   r   r   r   r   r   r      s      )ÚtypingÚ
get_originÚUnionr   r	   r   Z	UnionTypeÚget_argsÚlenÚanyÚnext)r   ÚoriginZ
union_argsZhas_none_argZtype_argr   r   r   Úget_optional_arg   s    

r   c                 C   s2   dt j  krdk r*n nt| tjƒr*dS t| ƒS )zTTest if a given annotation is a class that can be used in isinstance()/issubclass().)r   é	   )r   é   F)r   r	   Ú
isinstancer   ZGenericAliasr   )r   r   r   r   Úannotation_is_class%   s    &r#   )r   Úclsr   c                 C   s   t | ƒot| |ƒS )z4Test if a given annotation is of the given subclass.)r#   Ú
issubclass)r   r$   r   r   r   Úannotation_issubclass/   s    r&   )Ú__doc__r   r   r   Úinspectr   ÚAnyÚboolr   r   r#   r
   r&   r   r   r   r   Ú<module>   s   
