U
    hJ                     @   s  d Z ddlmZmZ ddlZddlmZ dd Zdd Zd8d	d
ZG dd de	Z
e
defi Zee_de_ edfddZedfddZedfddZedfddZefddZefddZG dd dZdd Zdd  ZG d!d" d"ZG d#d$ d$Ze ZG d%d& d&e	Ze ZG d'd( d(ed)ZG d*d+ d+ed)ZG d,d- d-ed)Z G d.d/ d/ed)Z!eee e!fD ]Z"d0j#e"jd1e"_ qf["e$ee$ef ed2d3d4Z%e$ed5d6d7Z&dS )9zDefines experimental extensions to the standard "typing" module that are
supported by the mypy typechecker.

Example usage:
    from mypy_extensions import TypedDict
    )AnyDictN_type_checkc              	   C   s>   z t djd dkrtdW n ttfk
r8   Y nX dS )N   __name__)abc	functoolstypingz4TypedDict does not support instance and class checksF)sys	_getframe	f_globals	TypeErrorAttributeError
ValueError)clsother r   3/tmp/pip-unpacked-wheel-vkqknlrd/mypy_extensions.py_check_fails   s    r   c                 O   s
   t ||S N)dict)r   argskwargsr   r   r   	_dict_new   s    r   c              	   K   sz   | dd}|d kr|}n|r&tdt||d}ztdjdd|d< W n ttfk
rh   Y nX t	|d	|dd
S )NtotalTz@TypedDict takes either a dict or keyword arguments, but not both)__annotations__	__total__r   r   __main__
__module__r   )_from_functional_call)
popr   r   r   r   r   getr   r   _TypedDictMeta)r   Z	_typename_fieldsr   r   nsr   r   r   _typeddict_new   s    r&   c                       s&   e Zd Zd fdd	Ze ZZ  ZS )r#   TFc           
         s   dt  kr*dd l}|jdt|r"dndd |dkr6tnt|d< tt| | |t	f|}|
di }d	  fd
d| D }|D ]}	||	j
di  q||_t|ds||_|S )N	TypedDictr   zmypy_extensions.TypedDict is deprecated, and will be removed in a future version. Use typing.TypedDict or typing_extensions.TypedDict instead.      
stacklevel__new__r   z?TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a typec                    s   i | ]\}}|t | qS r   r   ).0ntpmsgr   r   
<dictcomp>L   s      z*_TypedDictMeta.__new__.<locals>.<dictcomp>r   )globalswarningswarnDeprecationWarningr&   r   superr#   r,   r   r"   itemsupdate__dict__r   hasattrr   )
r   namebasesr%   r   r    r4   tp_dictannsbase	__class__r0   r   r,   1   s$    




z_TypedDictMeta.__new__)TF)r   r   __qualname__r,   r   __instancecheck____subclasscheck____classcell__r   r   rA   r   r#   0   s   #r#   r'   a  A simple typed name space. At runtime it is equivalent to a plain dict.

    TypedDict creates a dictionary type that expects all of its
    instances to have a certain set of keys, with each key
    associated with a value of a consistent type. This expectation
    is not checked at runtime but is only enforced by typecheckers.
    Usage::

        Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
        a: Point2D = {'x': 1, 'y': 2, 'label': 'good'}  # OK
        b: Point2D = {'z': 3, 'label': 'bad'}           # Fails type check
        assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')

    The type info could be accessed via Point2D.__annotations__. TypedDict
    supports two additional equivalent forms::

        Point2D = TypedDict('Point2D', x=int, y=int, label=str)

        class Point2D(TypedDict):
            x: int
            y: int
            label: str

    The latter syntax is only supported in Python 3.6+, while two other
    syntax forms work for 3.2+
    c                 C   s   | S )zA normal positional argumentr   typer<   r   r   r   Argz   s    rI   c                 C   s   | S )z*A positional argument with a default valuer   rG   r   r   r   
DefaultArg   s    rJ   c                 C   s   | S )zA keyword-only argumentr   rG   r   r   r   NamedArg   s    rK   c                 C   s   | S )z,A keyword-only argument with a default valuer   rG   r   r   r   DefaultNamedArg   s    rL   c                 C   s   | S )z*A *args-style variadic positional argumentr   rH   r   r   r   VarArg   s    rN   c                 C   s   | S )z*A **kwargs-style variadic keyword argumentr   rM   r   r   r   KwArg   s    rO   c                   @   s   e Zd ZdS )_DEPRECATED_NoReturnN)r   r   rC   r   r   r   r   rP      s    rP   c                 C   s   | S r   r   )r   r   r   r   trait   s    rQ   c                  O   s   dd S )Nc                 S   s   | S r   r   )xr   r   r   <lambda>       zmypyc_attr.<locals>.<lambda>r   )attrsZkwattrsr   r   r   
mypyc_attr   s    rV   c                   @   s   e Zd Zdd Zdd ZdS )_FlexibleAliasClsAppliedc                 C   s
   || _ d S r   val)selfrY   r   r   r   __init__   s    z!_FlexibleAliasClsApplied.__init__c                 C   s   | j S r   rX   rZ   r   r   r   r   __getitem__   s    z$_FlexibleAliasClsApplied.__getitem__N)r   r   rC   r[   r]   r   r   r   r   rW      s   rW   c                   @   s   e Zd Zdd ZdS )_FlexibleAliasClsc                 C   s   t |d S )N)rW   r\   r   r   r   r]      s    z_FlexibleAliasCls.__getitem__N)r   r   rC   r]   r   r   r   r   r^      s   r^   c                   @   s   e Zd Zdd ZdS )_NativeIntMetac                 C   s
   t |tS r   )
isinstanceint)r   instr   r   r   rD      s    z _NativeIntMeta.__instancecheck__N)r   r   rC   rD   r   r   r   r   r`      s   r`   c                   @   s   e Zd ZdefddZdS )i64r   c                 C   s   |t k	rt||S t|S r   	_sentinelrb   r   rR   r@   r   r   r   r,      s    
zi64.__new__Nr   r   rC   rf   r,   r   r   r   r   rd      s   rd   )	metaclassc                   @   s   e Zd ZdefddZdS )i32r   c                 C   s   |t k	rt||S t|S r   re   rg   r   r   r   r,      s    
zi32.__new__Nrh   r   r   r   r   rj      s   rj   c                   @   s   e Zd ZdefddZdS )i16r   c                 C   s   |t k	rt||S t|S r   re   rg   r   r   r   r,      s    
zi16.__new__Nrh   r   r   r   r   rk      s   rk   c                   @   s   e Zd ZdefddZdS )u8r   c                 C   s   |t k	rt||S t|S r   re   rg   r   r   r   r,      s    
z
u8.__new__Nrh   r   r   r   r   rl      s   rl   a/  A native fixed-width integer type when used with mypyc.

        In code not compiled with mypyc, behaves like the 'int' type in these
        runtime contexts:

        * {name}(x[, base=n]) converts a number or string to 'int'
        * isinstance(x, {name}) is the same as isinstance(x, int)
        r<   )r<   module_globalsreturnc                 C   s   | d|   }d kr2dt d|  d}t|||| < | dkr\d|  d|  d|  d	}nd
sptd|  ddd l}|j|tdd |S )NZ_DEPRECATED_zmodule 'z' has no attribute ''>   NoReturnz'mypy_extensions.zF' is deprecated, and will be removed in a future version. Use 'typing.z' or 'typing_extensions.z	' insteadFz-Add deprecation message for 'mypy_extensions.r   r(   r*   )r"   r   r   AssertionErrorr4   r5   r6   )r<   rn   rY   r1   r4   r   r   r   _warn_deprecation   s    rs   )r<   ro   c                 C   s   t | t dS )N)rn   )rs   r3   rm   r   r   r   __getattr__   s    rt   )N)'__doc__r
   r   r   r   r   r   r   r&   rH   r#   r   r'   r   r   rI   rJ   rK   rL   rN   rO   rP   rQ   rV   rW   r^   ZFlexibleAliasr`   objectrf   rd   rj   rk   rl   Z	_int_typeformatstrrs   rt   r   r   r   r   <module>   sJ   

'!	