B
    F.\K               	   @   s  d dl mZmZmZ d dlZd dlZejd  dkrd dlmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ eZeZdZdZeZeZ G dd de!Z"d dl#Z#dd Z$dd Z%dd Z&dd Z'dd Z(ej)Z*dd Z+ejd  dkrd dl,m+Z+ d d	l-mZmZmZmZ d dl.mZmZ d dl/mZ d dl0mZ d dl/m'Z' d dl1m(Z( d d lm2Z d dl3mZ d d
l4mZ dZdZe5Zd d!l#m6Z$ d d"l#m7Z% eZe Z e"Z"d#d Z&ej89 Z*e*:ej; d dl<Z<e<= > d$kZ?ej<@d%ZAyd d&lBmCZC W n eDeEfk
r4   eFZCY nX yd d'lGmHZH W n" eDk
rh   d d'lHmHZH Y nX yd d(lImJZJ W n: eDk
r   d dlKZKd d)lImLZL G d*d+ d+eMZJY nX dS ),    )print_functiondivisionabsolute_importN   )QueueEmpty)BytesIO)	get_ident)
getargspec)escape)IteratorMappingSetMutableMapping)gcdTFc               @   s   e Zd ZdS )StopAsyncIterationN)__name__
__module____qualname__ r   r   8lib/python3.7/site-packages/distributed/compatibility.pyr      s   r   c             C   s$   t jt| d}| }|  |S )N)fileobj)gzipGzipFiler   readclose)bfresultr   r   r   gzip_decompress   s    r   c             C   s<   t  }tj|dd}||  |  |d | }|S )Nw)r   moder   )r   r   r   writer   seekr   )r   Zbior   r   r   r   r   gzip_compress"   s    

r$   c             C   s   t | dot | do| jdkS )Nqueuer   r   )hasattrr   )or   r   r   isqueue+   s    

r(   c               C   s   d S )Nr   r   r   r   r   invalidate_caches0   s    r)   c             C   s    dd l }|j| \}}|d S )Nr   z.pyc)ospathsplitext)r+   r*   nameZextr   r   r   cache_from_source3   s    r.   c             C   s   dS )NFr   )funcr   r   r   iscoroutinefunction:   s    r0      )r0   )reload)r)   )r.   )getfullargspec)
decompress)compressc             C   s
   t | tS )N)
isinstancer   )r'   r   r   r   r(   R   s    Zpypywin)JSONDecodeError)singledispatch)finalize)refc               @   s   e Zd ZdZdZi ZdZe Z	dZ
dZG dd dZdd Zdd	d
Zdd Zdd Zedd Zedd Zejdd Zdd Zedd Zedd ZdS )r:   a6  Class for finalization of weakrefable objects

        finalize(obj, func, *args, **kwargs) returns a callable finalizer
        object which will be called when obj is garbage collected. The
        first time the finalizer is called it evaluates func(*arg, **kwargs)
        and returns the result. After this the finalizer is dead, and
        calling it just returns None.

        When the program exits any remaining finalizers for which the
        atexit attribute is true will be run in reverse order of creation.
        By default atexit is true.
        r   Fc               @   s   e Zd ZdZdS )zfinalize._Info)weakrefr/   argskwargsatexitindexN)r   r   r   	__slots__r   r   r   r   _Info   s   rB   c             O   sp   | j s dd l}|| j dt_ |  }t|| |_||_||_	|pFd |_
d|_t| j|_|| j| < dt_d S )Nr   T)_registered_with_atexitr?   register	_exitfuncr:   rB   r;   r<   r/   r=   r>   next_index_iterr@   	_registry_dirty)selfobjr/   r=   r>   r?   infor   r   r   __init__   s    

zfinalize.__init__Nc             C   s0   | j | d}|r,| js,|j|j|jp(i S dS )z^If alive then mark as dead and return func(*args, **kwargs);
            otherwise return NoneN)rH   pop	_shutdownr/   r=   r>   )rJ   _rL   r   r   r   __call__   s    
zfinalize.__call__c             C   sH   | j | }|o| }|dk	rD| j | drD||j|j|jp@i fS dS )zbIf alive then mark as dead and return (obj, func, args, kwargs);
            otherwise return NoneN)rH   getr<   rN   r/   r=   r>   )rJ   rL   rK   r   r   r   detach   s    zfinalize.detachc             C   s:   | j | }|o| }|dk	r6||j|j|jp2i fS dS )zQIf alive then return (obj, func, args, kwargs);
            otherwise return NoneN)rH   rR   r<   r/   r=   r>   )rJ   rL   rK   r   r   r   peek   s    zfinalize.peekc             C   s
   | | j kS )zWhether finalizer is alive)rH   )rJ   r   r   r   alive   s    zfinalize.alivec             C   s   | j | }t|o|jS )z*Whether finalizer should be called at exit)rH   rR   boolr?   )rJ   rL   r   r   r   r?      s    zfinalize.atexitc             C   s   | j | }|rt||_d S )N)rH   rR   rV   r?   )rJ   valuerL   r   r   r   r?      s    c             C   s^   | j | }|o| }|d kr6dt| jt| f S dt| jt| t|jt|f S d S )Nz<%s object at %#x; dead>z!<%s object at %#x; for %r at %#x>)rH   rR   r<   typer   id)rJ   rL   rK   r   r   r   __repr__   s    zfinalize.__repr__c             C   s2   dd | j  D }|jdd d dd |D S )Nc             S   s   g | ]\}}|j r||fqS r   )r?   ).0r   ir   r   r   
<listcomp>   s    z-finalize._select_for_exit.<locals>.<listcomp>c             S   s
   | d j S )N   )r@   )itemr   r   r   <lambda>   s    z+finalize._select_for_exit.<locals>.<lambda>)keyc             S   s   g | ]\}}|qS r   r   )r[   r   r\   r   r   r   r]      s    )rH   itemssort)clsLr   r   r   _select_for_exit   s    zfinalize._select_for_exitc             C   s   d}z| j rdd l}| r(d}|  d }xj|d ks<tjrJ|  }dt_|sPP | }y
|  W n" tk
r   t	j
t	   Y nX || j ks.tq.W W d dt_|r|  X d S )NFr   T)rH   gc	isenableddisabler:   rI   rf   rN   	Exceptionsys
excepthookexc_infoAssertionErrorrO   enable)rd   reenable_gcrg   pendingr   r   r   r   rE      s.    
zfinalize._exitfunc)N)r   r   r   __doc__rA   rH   rO   	itertoolscountrG   rI   rC   rB   rM   rQ   rS   rT   propertyrU   r?   setterrZ   classmethodrf   rE   r   r   r   r   r:   o   s$   
	r:   )NZ
__future__r   r   r   Zloggingrk   version_infor   r   ior   Zthreadr	   Zget_thread_identityinspectr
   Zcgir   Zhtml_escapecollectionsr   r   r   r   Z	fractionsr   r2   ZunicodeZPY2ZPY3OSErrorConnectionRefusedErrorFileExistsErrorrj   r   r   r   r$   r(   r)   r.   Z_levelNamesZlogging_namesr0   ZasyncioZcollections.abcr%   	importlibZ	threadingimportlib.utilr3   ZhtmlZmathstrr4   r5   Z_levelToNamecopyupdateZ_nameToLevelplatformZpython_implementationlowerZPYPY
startswithZWINDOWSZjson.decoderr8   ImportErrorAttributeError
ValueError	functoolsr9   r<   r:   rs   r;   objectr   r   r   r   <module>   s   	

