
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
5*[Z¸@  ã               @   s¸  d Z ddlmZ ddlZddlZddlZddlZddlZddlZdZ	ej
dkrdddlmZ dd„ Znejd	d
ƒZdd„ Zdd„ Zy
ejZW n ek
r¦   dd„ ZY nX ejddƒZdd„ ZejdƒZG dd„ deƒZf fdd„Zd*dd„ZyddlmZ W n" ek
�r   ddlmZ Y nX G dd„ deƒZeejƒZe ej!ƒZ"e"dk�rhej# �rhd d!„ Zee_n,e"dk�r|ej#�r|ne"d"k�r”d#d!„ Zee_eeƒZ$d$d%„ Z%d&d'„ Z&d(d)„ Z'dS )+zT
Decorator module, see http://pypi.python.org/pypi/decorator
for the documentation.
é    )Úprint_functionNz4.2.1Ú3)Úgetfullargspecc             C   s   | j S )N)Ú__init__)Úcls© r   ú/usr/lib/python3.6/decorator.pyÚget_init0   s    r	   ÚFullArgSpecz5args varargs varkw defaults kwonlyargs kwonlydefaultsc             C   s   t jtj| ƒg df ƒS )z?A quick and dirty replacement for getfullargspec for Python 2.XN)r
   Ú_makeÚinspectÚ
getargspec)Úfr   r   r   r   7   s    r   c             C   s   | j jS )N)r   Ú__func__)r   r   r   r   r	   ;   s    c             C   s   dS )NFr   )r   r   r   r   ÚiscoroutinefunctionB   s    r   ÚArgSpeczargs varargs varkw defaultsc             C   s   t | ƒ}t|j|j|j|jƒS )z$A replacement for inspect.getargspec)r   r   ÚargsÚvarargsÚvarkwÚdefaults)r   Úspecr   r   r   r   J   s    r   z\s*def\s*([_\w][_\w\d]*)\s*\(c               @   sZ   e Zd ZdZejƒ Zf  Z Z Z	 Z
 ZZddd„Zdd„ Zddd	„Zeddd„ƒZdS )ÚFunctionMakerz´
    An object with the ability to create functions with a given signature.
    It has attributes name, doc, module, signature, defaults, dict and
    methods update and make.
    Nc             C   sÞ  || _ |�rf|j| _| jdkr$d| _|j| _|j| _tj|ƒ�rft	|ƒ}t
|di ƒ| _xdD ]}	t| |	t
||	ƒƒ q\W x&t| jƒD ]\}
}t| d
|
 |ƒ q‚W t| jƒ}t| jƒ}| jrÚ|jd| j ƒ |jd| j ƒ n| jrê|jdƒ x.| jD ]$}	|jd|	 ƒ |jd|	|	f ƒ qòW | j�rB|jd| j ƒ |jd| j ƒ dj|ƒ| _dj|ƒ| _ |jjƒ | _|�rr|| _|d k	�r‚|| _|�rŽ|| _|�rš|| _|�r¦|| _|�r²|| _t| dƒ�sÂt‚t| dƒ�sÚtd| ƒ‚d S )Nz<lambda>Ú_lambda_Ú__annotations__r   r   r   r   Ú
kwonlyargsÚkwonlydefaultszarg%dÚ*z%s=Nonez%s=%sz**z, ÚnameÚ	signaturez%You are decorating a non function: %s)r   r   r   r   r   r   )ÚshortsignatureÚ__name__r   Ú__doc__ÚdocÚ
__module__Úmoduler   Ú
isfunctionr   ÚgetattrÚannotationsÚsetattrÚ	enumerater   Úlistr   Úappendr   r   Újoinr   Ú__dict__ÚcopyÚdictr   ÚhasattrÚAssertionErrorÚ	TypeError)ÚselfÚfuncr   r   r   r"   r$   ZfuncdictZargspecÚaÚiÚargZallargsZallshortargsr   r   r   r   a   s\    




zFunctionMaker.__init__c             K   sš   | j |_t| ddƒ|_t| di ƒ|_| j|_| jp4d|_t| ddƒ|_	yt
jdƒ}W n tk
rl   d}Y nX |jjddƒ}t| d|ƒ|_|jj|ƒ dS )	z2Update the signature of func with the data in selfr"   Nr/   r'   é   ú?r    r$   )r   r    r&   r!   r-   r   Ú__defaults__r   Ú__kwdefaults__r   ÚsysÚ	_getframeÚAttributeErrorÚ	f_globalsÚgetr#   Úupdate)r3   r4   ÚkwÚframeZcallermoduler   r   r   rA   •   s    
zFunctionMaker.updateFc          
   K   s  |t | ƒ }|pi }tj|ƒ}|dkr2td| ƒ‚|jdƒ}t|gdd„ | jjdƒD ƒ ƒ}x$|D ]}	|	dkrbtd	|	|f ƒ‚qbW |j	d
ƒs”|d
7 }dt
| jƒf }
yt||
dƒ}t||ƒ W n*   tdtjd� t|tjd� ‚ Y nX || }|�r ||d< | j|f|Ž |S )zBMake a new function from a given template and update the signatureNz not a valid function template
%sé   c             S   s   g | ]}|j d ƒ‘qS )z *)Ústrip)Ú.0r7   r   r   r   ú
<listcomp>®   s    z&FunctionMaker.make.<locals>.<listcomp>ú,Ú_func_Ú_call_z%s is overridden in
%sÚ
z<decorator-gen-%d>ZsinglezError in generated code:)ÚfileZ
__source__)rI   rJ   )ÚvarsÚDEFÚsearchÚSyntaxErrorÚgroupÚsetr   ÚsplitÚ	NameErrorÚendswithÚnextÚ_compile_countÚcompileÚexecÚprintr<   ÚstderrrA   )r3   Z	src_templÚevaldictÚ	addsourceÚattrsÚsrcÚmor   ÚnamesÚnÚfilenameÚcoder4   r   r   r   Úmake¦   s4    



zFunctionMaker.makeTc             K   s¨   t |tƒr0|jƒ jddƒ\}	}
|
dd… }d}nd}	d}|}| ||	||||ƒ}djdd„ |jƒ D ƒƒ}|jdƒ}|rŽt|ƒrŽd| jd	d
ƒ}nd| }|j	|||f|ŽS )zú
        Create a function from the strings name, signature and body.
        evaldict is the evaluation dictionary. If addsource is true an
        attribute __source__ is added to the result. The attributes attrs
        are added, if any.
        ú(rD   NrK   c             s   s   | ]}d | V  qdS )z    Nr   )rF   Úliner   r   r   ú	<genexpr>Ú   s    z'FunctionMaker.create.<locals>.<genexpr>rJ   z#async def %(name)s(%(signature)s):
Úreturnzreturn awaitzdef %(name)s(%(signature)s):
éÿÿÿÿ)
Ú
isinstanceÚstrrE   rS   r,   Ú
splitlinesr@   r   Úreplacere   )r   ÚobjZbodyr\   r   r"   r$   r]   r^   r   Úrestr   r4   r3   ZibodyÚcallerr   r   r   ÚcreateÈ   s    	


zFunctionMaker.create)NNNNNNN)NF)NNNT)r    r#   Ú__qualname__r!   Ú	itertoolsÚcountrW   r   r   r   r   r   r   r   rA   re   Úclassmethodrr   r   r   r   r   r   T   s    
3
" r   c       	      C   sn   t || d�}d}x0t|ƒD ]$\}}d| }|||< ||d 7 }qW tj| d| || d�}t| dƒrj| j|_|S )zE
    decorate(func, caller) decorates a function using a caller.
    )rJ   rI   Ú z_e%d_z, z,return _call_(_func_, %s%%(shortsignature)s))Ú__wrapped__rs   )r/   r)   r   rr   r0   rs   )	r4   rq   Zextrasr\   Zesr6   ZextraZexZfunr   r   r   Údecorateä   s    

ry   c       
      C   s  |dk	rt || ƒS df  }}tj| ƒrB| jjƒ }d| j| jf }n~tj| ƒr¬| jdkr\d}n| j}| j}| jj}t	| j
pzf ƒ}dj| jj|| |… ƒ}|r¤|d7 }| j
}n| jjjƒ }| jj}t| t d�}tjd	||f d
||f ||| j| d�}	|�rd| |	_
|	S )z=decorator(caller) converts a caller function into a decoratorNrw   zHdecorator(%s) converts functions/generators into factories of %s objectsz<lambda>r   z, rH   )Ú_callZ
_decorate_z%s(func, %s)zhif func is None: return lambda func:  _decorate_(func, _call, (%s))
return _decorate_(func, _call, (%s)))r"   r$   rx   )N)ry   r   Zisclassr    Úlowerr%   r!   Ú__code__Úco_argcountÚlenr:   r,   Úco_varnamesÚ	__class__Ú__call__r/   r   rr   r#   )
rq   Z_funcZdefaultargsr   r   r"   ÚnargsZndefsr\   Údecr   r   r   Ú	decoratorö   s:    







r„   )Ú_GeneratorContextManager)ÚGeneratorContextManagerc               @   s   e Zd Zdd„ ZdS )ÚContextManagerc             C   s   t j|dt| |d�|d�S )zContext manager decoratorz.with _self_: return _func_(%(shortsignature)s))Z_self_rI   )rx   )r   rr   r/   )r3   r4   r   r   r   r�   #  s    zContextManager.__call__N)r    r#   rs   r�   r   r   r   r   r‡   "  s   r‡   é   c             O   s   t j| |||ŽƒS )N)r…   r   )r3   Úgr5   Úkr   r   r   r   -  s    r   é   c             O   s   t j| |||ƒS )N)r…   r   )r3   r‰   r5   rŠ   r   r   r   r   3  s    c             C   s   t | ƒS )N)Ú_contextmanager)r4   r   r   r   Úcontextmanager:  s    r�   c             C   sR   d}x:t |ƒD ].\}}t|| ƒr&d}P t| |ƒr| ||< d}qW |rN|j| ƒ dS )z_
    Append ``a`` to the list of the virtual ancestors, unless it is already
    included.
    TFN)r)   Ú
issubclassr+   )r5   Ú
vancestorsÚaddÚjÚvar   r   r   r+   A  s    

r+   c                 sL   ˆst dƒ‚ddjˆƒ ‰tjdf‡fdd„	‰ ‡ ‡‡fdd„}d	ˆ |_|S )
zr
    Factory of decorators turning a function into a generic function
    dispatching on the given arguments.
    zNo dispatch args passedz(%s,)z, rw   c                s0   |t | ƒt ˆ ƒƒr,tdt ˆ ƒt | ƒ|f ƒ‚dS )z5Make sure one passes the expected number of argumentszExpected %d arguments, got %d%sN)r~   r2   )Z	argumentsZwrongÚmsg)Údispatch_argsr   r   Úcheck[  s    zdispatch_on.<locals>.checkc                sœ   t tˆƒjƒ}t ˆƒ|ks&tdˆ ƒ‚i ‰‡‡‡fdd„‰‡‡fdd„‰ ‡‡fdd„}‡ ‡fdd	„}‡ ‡‡fd
d„}tjˆdˆ t|d�|ˆˆˆˆ |ˆd�
S )z4Decorator turning a function into a generic functionzUnknown dispatch arguments %sc                 sv   ˆ | ƒ dd„ t tˆƒƒD ƒ}xHˆD ]@}x:t| ||ƒD ]*\}}}t||ƒr6||jƒ kr6t||ƒ q6W q$W dd„ |D ƒS )zU
            Get a list of sets of virtual ancestors for the given types
            c             S   s   g | ]}g ‘qS r   r   )rF   Ú_r   r   r   rG   p  s    zIdispatch_on.<locals>.gen_func_dec.<locals>.vancestors.<locals>.<listcomp>c             S   s   g | ]}t |ƒ‘qS r   )rR   )rF   Úrar   r   r   rG   u  s    )Úranger~   ÚziprŽ   Úmror+   )ÚtypesZrasÚtypes_ÚtZtype_r—   )r•   r”   Útypemapr   r   r�   k  s    
z5dispatch_on.<locals>.gen_func_dec.<locals>.vancestorsc                 s”   ˆ | ƒ g }x‚t | ˆ| Ž ƒD ]p\}}t|ƒ}|dkrFtd||f ƒ‚n4|dkrr|\}td||fi ƒjƒ dd… }n|jƒ }|j|dd… ƒ qW |S )zG
            Get a list of virtual MROs, one for each type
            rD   zAmbiguous dispatch for %s: %sr�   Nrj   )r™   r~   ÚRuntimeErrorÚtyperš   r+   )r›   Zlistsr�   ZvasZn_vasr’   rš   )r•   r�   r   r   Ú	ancestorsw  s    z4dispatch_on.<locals>.gen_func_dec.<locals>.ancestorsc                 s   ˆˆ ƒ ‡‡‡ fdd„}|S )zU
            Decorator to register an implementation for the given types
            c                s&   ˆ t | ƒjtjd| j ƒ | ˆˆ< | S )Nz in )r   r   ÚoperatorÚltr    )r   )r•   rž   r›   r   r   rƒ   �  s    z@dispatch_on.<locals>.gen_func_dec.<locals>.register.<locals>.decr   )r›   rƒ   )r•   rž   )r›   r   ÚregisterŠ  s    z3dispatch_on.<locals>.gen_func_dec.<locals>.registerc                 s@   ˆ| ƒ g }x.t jˆ | Ž Ž D ]}|jtdd„ |D ƒƒƒ qW |S )zI
            An utility to introspect the dispatch algorithm
            c             s   s   | ]}|j V  qd S )N)r    )rF   r5   r   r   r   rh   �  s    zKdispatch_on.<locals>.gen_func_dec.<locals>.dispatch_info.<locals>.<genexpr>)rt   Úproductr+   Útuple)r›   ZlstZanc)r¡   r•   r   r   Údispatch_info–  s
    z8dispatch_on.<locals>.gen_func_dec.<locals>.dispatch_infoc                sˆ   t dd„ | D ƒƒ}yˆ| }W n tk
r2   Y nX |||ŽS tjˆ |Ž Ž }t|ƒ x(|D ] }ˆj|ƒ}|d k	rZ|||ŽS qZW ˆ||ŽS )Nc             s   s   | ]}t |ƒV  qd S )N)r    )rF   r7   r   r   r   rh   ¡  s    zGdispatch_on.<locals>.gen_func_dec.<locals>._dispatch.<locals>.<genexpr>)r¦   ÚKeyErrorrt   r¥   rV   r@   )r”   r   rB   r›   r   Úcombinationsrœ   )r¡   r4   rž   r   r   Ú	_dispatch   s    


z4dispatch_on.<locals>.gen_func_dec.<locals>._dispatchz#return _f_(%s, %%(shortsignature)s))Z_f_)r¤   Údefaultrž   r�   r¡   r§   rx   )rR   r   r   rT   r   rr   r/   )r4   Zargsetr¤   r§   rª   )r•   r”   Údispatch_str)r¡   r4   rž   r�   r   Úgen_func_deca  s    
z!dispatch_on.<locals>.gen_func_decÚdispatch_on)r1   r,   r¢   Úner    )r”   r­   r   )r•   r”   r¬   r   r®   S  s    W
r®   )N)(r!   Z
__future__r   Úrer<   r   r¢   rt   ÚcollectionsÚ__version__Úversionr   r	   Ú
namedtupler
   r   r>   r   r   rX   rN   Úobjectr   ry   r„   Ú
contextlibr…   ÚImportErrorr†   r‡   r   Zinitr~   r   Zn_argsr   rŒ   r�   r+   r®   r   r   r   r   Ú<module>!   s\   



 
&


