Your IP : 3.145.152.49
o
6��f�� � @ s� d Z g d�ZddlmZ ddlmZ ddlmZ ddlm Z ddl
mZ dZd Z
ee
fd
d�Zee
fdd
�Zefdd�Zefdd�Zefdd�Zefdd�Zefdd�Zefdd�Zefdd�Zefdd�Zefdd�Zefd d!�Zefd"d#�Zefd$d%�Zd&efd'efd(efgd(efd)efd&efgd)efd(efd'efgd'efd&efd)efgd*�Zd+d,� Zd-d.� Zzdd/l mZ W n e!y� Y nw e"� Z#e#fd0d1�Z$zdd2l m$Z$ W n e!y� Y nw G d3d4� d4�Z%zdd5l m%Z% W n e!y� Y nw G d6d7� d7e"�Z&d8d9� Z'ed:g d;��Z(G d<d=� d=e)�Z*e"� fe+e,he-e.e/fd>d?�Z0dXdBdC�Z1dDdE� Z2zddFl m2Z2 W n
e!�y; Y nw dGdH� Z3dIdJ� Z4dYdLdM�Z5dNdO� Z6dPdQ� Z7dRdS� Z8G dTdU� dU�Z9e"� Z:G dVdW� dW�Z;dKS )ZzEfunctools.py - Tools for working with functions and callable objects
)�update_wrapper�wraps�WRAPPER_ASSIGNMENTS�WRAPPER_UPDATES�total_ordering�cache�
cmp_to_key� lru_cache�reduce�partial�
partialmethod�singledispatch�singledispatchmethod�cached_property� )�get_cache_token)�
namedtuple)�recursive_repr)�RLock)�GenericAlias)�
__module__�__name__�__qualname__�__doc__�__annotations__)�__dict__c C sd |D ]}zt ||�}W n ty Y qw t| ||� q|D ]}t | |��t ||i �� q|| _| S )a Update a wrapper function to look like the wrapped function
wrapper is the function to be updated
wrapped is the original function
assigned is a tuple naming the attributes assigned directly
from the wrapped function to the wrapper function (defaults to
functools.WRAPPER_ASSIGNMENTS)
updated is a tuple naming the attributes of the wrapper that
are updated with the corresponding attribute from the wrapped
function (defaults to functools.WRAPPER_UPDATES)
)�getattr�AttributeError�setattr�update�__wrapped__)�wrapper�wrapped�assigned�updated�attr�value� r&