
#R;u                 @   s  d  Z  d d l m Z m Z m Z d d l Z d d l Z d d l Z d d l Z y d d l	 m
 Z
 Wn" e k
 r d d l m
 Z
 Yn Xd d l m Z d d d d	 g Z e e j  Z e e j  Z e e e j f Z d d
 d  Z d d   Z d d	   Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z e d d d Z e d d d Z  e d d d Z! e d d d Z" e d d d Z# Gd d   d e  Z$ Gd  d   d e  Z% Gd! d   d e  Z& d S)"zFunction signature objects for callables

Back port of Python 3.3's function signature tools from the inspect module,
modified to be compatible with Python 2.6, 2.7 and 3.2+.
    )absolute_importdivisionprint_functionN)OrderedDict)__version__BoundArguments	Parameter	Signature	signaturec             C   sJ   t  |  t  r@ |  j d d | f k r. |  j S|  j d |  j St |   S)NbuiltinsZ__builtin__.)
isinstancetype
__module____name__repr)
annotationZbase_module r   3/usr/lib/python3/dist-packages/funcsigs/__init__.pyformatannotation   s
    r   c             G   sv   yF |  t  k r d  St |  |  } x  | D] } t | | |  } q) WWn t k
 r^ d  SYn Xt | t  sr | Sd  S)N)r   getattrAttributeErrorr   _NonUserDefinedCallables)clsZmethod_namenestedmethnamer   r   r   _get_user_defined_method'   s    	r   c          $   C   s  t  |   s! t d j |     t |  t j  r t |  j  } |  j d k r | j	 r | j	 j
   d j d t  } | j d | f t | j	 j
    d d   S| Sn) | j d t | j	 j
    d d   Sy |  j } Wn t k
 r Yn X| d k	 r| Sy |  j } Wn t k
 r,Yn Xt |  St |  t j  rVt j |   St |  t j  rt |  j  } t | j	 j    } |  j pf  } |  j pi  } y | j | |   } Wn@ t k
 r} z  d j |   }	 t |	   WYd d } ~ Xn Xx~ | j j   D]m \ }
 } | |
 } |
 | k rT| j d | d	 d
  | |
 <q| j t t  f k r| j! r| j" |
  qW| j d | j
    Sd } t |  t#  r3t$ t# |   d  } | d k	 rt |  } qrt$ |  d  } | d k	 r	t |  } qrt$ |  d  } | d k	 rrt |  } n? t |  t%  srt$ t# |   d d  } | d k	 rrt |  } | d k	 r| j d t | j	 j
    d d   St |  t j&  rd j |   }	 t |	   t d j |     d S)z/Get a signature object for the passed callable.z{0!r} is not a callable objectNr   kind
parameters   z,partial object {0!r} has incorrect argumentsdefault_partial_kwargT__call____new____init__Zim_funcz-no signature found for builtin function {0!r}z,callable {0!r} is not supported by signature)'callable	TypeErrorformatr   types
MethodTyper
   __func____self__r   valuesreplace_POSITIONAL_ONLYtupleZ__signature__r   __wrapped__FunctionTyper	   from_function	functoolspartialfuncr   itemsargskeywordsbind_partial
ValueError	argumentsr   _VAR_KEYWORD_VAR_POSITIONALr"   popr   r   r   BuiltinFunctionType)objZsigfirstwrappedZ
new_paramsZpartial_argsZpartial_keywordsZbaexmsgZarg_nameZ	arg_valueparamcallnewZinitr   r   r   r
   7   s    			')


)c               @   s   e  Z d  Z d Z d S)_voidz0A private marker - used in Parameter & SignatureN)r   r   __qualname____doc__r   r   r   r   rI      s   rI   c               @   s   e  Z d  Z d S)_emptyN)r   r   rJ   r   r   r   r   rL      s   rL   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)_ParameterKindc             O   s#   t  j |  |  } | d | _ | S)Nr   )intr$   _name)selfr8   kwargsrA   r   r   r   r$      s    z_ParameterKind.__new__c             C   s   |  j  S)N)rO   )rP   r   r   r   __str__   s    z_ParameterKind.__str__c             C   s   d j  |  j  S)Nz<_ParameterKind: {0!r}>)r(   rO   )rP   r   r   r   __repr__   s    z_ParameterKind.__repr__N)r   r   rJ   r$   rR   rS   r   r   r   r   rM      s   rM   r   POSITIONAL_ONLYr    POSITIONAL_OR_KEYWORD   VAR_POSITIONAL   KEYWORD_ONLY   VAR_KEYWORDc               @   s   e  Z d  Z d Z d Z e Z e Z e	 Z
 e Z e Z e Z e e d d d	  Z e d
 d    Z e d d    Z e d d    Z e d d    Z e e e e e d d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d S) r   a  Represents a parameter in a function signature.

    Has the following public attributes:

    * name : str
        The name of the parameter as a string.
    * default : object
        The default value for the parameter if specified.  If the
        parameter has no default value, this attribute is not set.
    * annotation
        The annotation for the parameter if specified.  If the
        parameter has no annotation, this attribute is not set.
    * kind : str
        Describes how argument values are bound to the parameter.
        Possible values: `Parameter.POSITIONAL_ONLY`,
        `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`,
        `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`.
    rO   _kind_default_annotationr"   Fc             C   s  | t  t t t t f k r' t d   | |  _ | t k	 ri | t t f k ri d j |  } t |   | |  _	 | |  _
 | d  k r | t  k r t d   | |  _ nU t |  } | t  k r t j d | t j  r d j |  } t |   | |  _ | |  _ d  S)Nz,invalid value for 'Parameter.kind' attributez){0} parameters cannot have default valuesz<None is not a valid name for a non-positional-only parameterz
[a-z_]\w*$z#{0!r} is not a valid parameter name)r/   _POSITIONAL_OR_KEYWORDr>   _KEYWORD_ONLYr=   r;   r\   rL   r(   r]   r^   rO   strrematchIr"   )rP   r   r   r!   r   r"   rE   r   r   r   r%      s(    				%	zParameter.__init__c             C   s   |  j  S)N)rO   )rP   r   r   r   r   
  s    zParameter.namec             C   s   |  j  S)N)r]   )rP   r   r   r   r!     s    zParameter.defaultc             C   s   |  j  S)N)r^   )rP   r   r   r   r     s    zParameter.annotationc             C   s   |  j  S)N)r\   )rP   r   r   r   r     s    zParameter.kindc          	   C   s   | t  k r |  j } | t  k r* |  j } | t  k r? |  j } | t  k rT |  j } | t  k ri |  j } t |   | | d | d | d | S)z+Creates a customized copy of the Parameter.r!   r   r"   )rI   rO   r\   r^   r]   r"   r   )rP   r   r   r   r!   r"   r   r   r   r.     s    					zParameter.replacec             C   s   |  j  } |  j } | t k r? | d  k r0 d } d j |  } |  j t k	 ri d j | t |  j   } |  j t k	 r d j | t |  j   } | t	 k r d | } n | t
 k r d | } | S)N z<{0}>z{0}:{1}z{0}={1}*z**)r   rO   r/   r(   r^   rL   r   r]   r   r>   r=   )rP   r   	formattedr   r   r   rR   0  s     			
zParameter.__str__c             C   s"   d j  |  j j t |   |  j  S)Nz<{0} at {1:#x} {2!r}>)r(   	__class__r   idr   )rP   r   r   r   rS   H  s    zParameter.__repr__c             C   s%   d j  |  j j  } t |   d  S)Nzunhashable type: '{0}')r(   rh   r   r'   )rP   rE   r   r   r   __hash__L  s    zParameter.__hash__c             C   sX   t  | j t  oW |  j | j k oW |  j | j k oW |  j | j k oW |  j | j k S)N)
issubclassrh   r   rO   r\   r]   r^   )rP   otherr   r   r   __eq__P  s
    zParameter.__eq__c             C   s   |  j  |  S)N)rm   )rP   rl   r   r   r   __ne__W  s    zParameter.__ne__N)z_namez_kindz_defaultz_annotationz_partial_kwarg)r   r   rJ   rK   	__slots__r/   rT   r_   rU   r>   rW   r`   rY   r=   r[   rL   emptyr%   propertyr   r!   r   r   rI   r.   rR   rS   rj   rm   rn   r   r   r   r   r      s*   	c               @   s|   e  Z d  Z d Z d d   Z e d d    Z e d d    Z e d d	    Z d
 d   Z	 d d   Z
 d d   Z d S)r   a  Result of `Signature.bind` call.  Holds the mapping of arguments
    to the function's parameters.

    Has the following public attributes:

    * arguments : OrderedDict
        An ordered mutable mapping of parameters' names to arguments' values.
        Does not contain arguments' default values.
    * signature : Signature
        The Signature object that created this instance.
    * args : tuple
        Tuple of positional arguments values.
    * kwargs : dict
        Dict of keyword arguments values.
    c             C   s   | |  _  | |  _ d  S)N)r<   
_signature)rP   r
   r<   r   r   r   r%   l  s    	zBoundArguments.__init__c             C   s   |  j  S)N)rr   )rP   r   r   r   r
   p  s    zBoundArguments.signaturec             C   s   g  } x |  j  j j   D]~ \ } } | j t t f k sC | j rD Py |  j | } Wn t k
 rj PYq X| j t	 k r | j
 |  q | j |  q Wt |  S)N)rr   r   r7   r   r=   r`   r"   r<   KeyErrorr>   extendappendr0   )rP   r8   
param_namerF   argr   r   r   r8   t  s    	zBoundArguments.argsc             C   s   i  } d } x |  j  j j   D] \ } } | sp | j t t f k sO | j rX d } n | |  j k rp d } q | sy q y |  j | } Wn t k
 r Yq X| j t k r | j	 |  q | | | <q W| S)NFT)
rr   r   r7   r   r=   r`   r"   r<   rs   update)rP   rQ   Zkwargs_startedrv   rF   rw   r   r   r   rQ     s(    		zBoundArguments.kwargsc             C   s%   d j  |  j j  } t |   d  S)Nzunhashable type: '{0}')r(   rh   r   r'   )rP   rE   r   r   r   rj     s    zBoundArguments.__hash__c             C   s4   t  | j t  o3 |  j | j k o3 |  j | j k S)N)rk   rh   r   r
   r<   )rP   rl   r   r   r   rm     s    zBoundArguments.__eq__c             C   s   |  j  |  S)N)rm   )rP   rl   r   r   r   rn     s    zBoundArguments.__ne__N)r   r   rJ   rK   r%   rq   r
   r8   rQ   rj   rm   rn   r   r   r   r   r   [  s   c               @   s   e  Z d  Z d Z d Z e Z e Z e	 Z
 d e	 d d d  Z e d d	    Z e d
 d    Z e d d    Z e e d d  Z d d   Z d d   Z d d   Z d d d  Z d d   Z d d   Z d d   Z d S) r	   a  A Signature object represents the overall signature of a function.
    It stores a Parameter object for each parameter accepted by the
    function, as well as information specific to the function itself.

    A Signature object has the following public attributes and methods:

    * parameters : OrderedDict
        An ordered mapping of parameters' names to the corresponding
        Parameter objects (keyword-only arguments are in the same order
        as listed in `code.co_varnames`).
    * return_annotation : object
        The annotation for the return type of the function if specified.
        If the function has no annotation for its return type, this
        attribute is not set.
    * bind(*args, **kwargs) -> BoundArguments
        Creates a mapping from positional and keyword arguments to
        parameters.
    * bind_partial(*args, **kwargs) -> BoundArguments
        Creates a partial mapping from positional and keyword arguments
        to parameters (simulating 'functools.partial' behavior.)
    _return_annotation_parametersNTc             C   s%  | d k r t    } n | r t    } t } x t |  D] \ } } | j } | | k  r d }	 |	 j | | j  }	 t |	   n | } | j }
 |
 d k r t |  }
 | j d |
  } |
 | k r d j |
  }	 t |	   | | |
 <q: Wn t  d d   | D  } | |  _	 | |  _
 d S)zConstructs Signature from the given list of Parameter
        objects and 'return_annotation'.  All arguments are optional.
        Nz%wrong parameter order: {0} before {1}r   zduplicate parameter name: {0!r}c             s   s   |  ] } | j  | f Vq d  S)N)r   ).0rF   r   r   r   	<genexpr>  s   z%Signature.__init__.<locals>.<genexpr>)r   r/   	enumerater   r(   r;   r   ra   r.   rz   ry   )rP   r   return_annotation__validate_parameters__ZparamsZtop_kindidxrF   r   rE   r   r   r   r   r%     s0    				zSignature.__init__c             C   s  t  | t j  s' t d j |    |  j } | j } | j } | j } t	 | d |   } t
 | d d  } | | | |  } t
 | d i   }	 | j }
 t
 | d d  } |
 r t |
  } n d } g  } | | } xI | d |  D]7 } |	 j | t  } | j | | d | d t  q Wx_ t | | d   D]G \ } } |	 j | t  } | j | | d | d t d	 |
 |  qBW| j d
 @r| | | } |	 j | t  } | j | | d | d t  xi | D]a } t } | d k	 r
| j | t  } |	 j | t  } | j | | d | d t d	 |  qW| j d @r| | } | j d
 @rs| d 7} | | } |	 j | t  } | j | | d | d t  |  | d |	 j d t  d d S)z2Constructs Signature for the given python functionz{0!r} is not a Python functionNco_kwonlyargcountr   __annotations____kwdefaults__r   r   r!   rZ      r    r~   returnr   F)r   r)   r2   r'   r(   _parameter_cls__code__co_argcountco_varnamesr0   r   __defaults__lengetrL   ru   r_   r}   co_flagsr>   r`   r=   )r   r6   r   Z	func_codeZ	pos_countZ	arg_namesZ
positionalZkeyword_only_countZkeyword_onlyZannotationsZdefaultsZ
kwdefaultsZpos_default_countr   Znon_default_countr   r   offsetr!   indexr   r   r   r3      sd    					
#




	zSignature.from_functionc             C   s@   y t  j |  j  SWn% t k
 r; t |  j j    SYn Xd  S)N)r)   MappingProxyTyperz   r   r   r7   )rP   r   r   r   r   I  s    zSignature.parametersc             C   s   |  j  S)N)ry   )rP   r   r   r   r~   P  s    zSignature.return_annotationc             C   sF   | t  k r |  j j   } | t  k r0 |  j } t |   | d | S)zCreates a customized copy of the Signature.
        Pass 'parameters' and/or 'return_annotation' arguments
        to override them in the new copy.
        r~   )rI   r   r-   ry   r   )rP   r   r~   r   r   r   r.   T  s    	zSignature.replacec             C   s%   d j  |  j j  } t |   d  S)Nzunhashable type: '{0}')r(   rh   r   r'   )rP   rE   r   r   r   rj   c  s    zSignature.__hash__c             C   s8  t  t |  t  sF |  j | j k sF t |  j  t | j  k rJ d St d d   t | j j    D  } x t |  j j	    D] \ } \ } } | j
 t k r y | j | } Wn t k
 r d SYq0X| | k r0d Sq y | | } Wn t k
 rd SYq X| | k s,| | j | k r d Sq Wd S)NFc             s   s!   |  ] \ } } | | f Vq d  S)Nr   )r{   r   rF   r   r   r   r|   m  s   z#Signature.__eq__.<locals>.<genexpr>T)rk   r   r	   r~   r   r   dictr}   keysr7   r   r`   rs   )rP   rl   Zother_positionsr   rv   rF   Zother_paramZ	other_idxr   r   r   rm   g  s,    (		zSignature.__eq__c             C   s   |  j  |  S)N)rm   )rP   rl   r   r   r   rn     s    zSignature.__ne__Fc             C   sq  t    } t |  j j    } f  } t |  } | rx x? |  j j   D]. \ } }	 |	 j rF | | k rF |	 j | | <qF Wxy t |  }
 Wnt k
 ry t |  }	 Wn t k
 r PYn X|	 j	 t
 k r Pn |	 j | k r&|	 j	 t k rd } | j d |	 j  } t |   |	 f } Pne |	 j	 t k sD|	 j t k	 rQ|	 f } Pn: | rd|	 f } Pn' d } | j d |	 j  } t |   Yq{ Xy t |  }	 Wn t k
 rt d   Yq{ X|	 j	 t t f k rt d   |	 j	 t
 k r|
 g } | j |  t |  | |	 j <P|	 j | k rEt d j d |	 j    |
 | |	 j <q{ Wd } x t j | |  D] }	 |	 j	 t k rt d j d |	 j    |	 j	 t k r|	 } qo|	 j } y | j |  }
 WnO t k
 r$| r |	 j	 t
 k r |	 j t k r t d j d |    YqoX|
 | | <qoW| ra| d k	 rU| | | j <n t d   |  j |  |  S)z$Private method.  Don't use directly.zA{arg!r} parameter is positional only, but was passed as a keywordrw   z'{arg!r} parameter lacking default valueztoo many positional argumentsz$multiple values for argument {arg!r}Nztoo many keyword arguments)r   iterr   r-   r7   r"   r!   nextStopIterationr   r>   r   r/   r(   r'   r=   rL   r`   rt   r0   	itertoolschainr?   rs   _bound_arguments_cls)rP   r8   rQ   r5   r<   r   Zparameters_exZarg_valsrv   rF   Zarg_valrE   r-   Zkwargs_paramr   r   r   _bind  s    						zSignature._bindc             O   s   |  j  | |  S)zGet a BoundArguments object, that maps the passed `args`
        and `kwargs` to the function's signature.  Raises `TypeError`
        if the passed arguments can not be bound.
        )r   )rP   r8   rQ   r   r   r   bind  s    zSignature.bindc             O   s   |  j  | | d d S)zGet a BoundArguments object, that partially maps the
        passed `args` and `kwargs` to the function's signature.
        Raises `TypeError` if the passed arguments can not be bound.
        r5   T)r   )rP   r8   rQ   r   r   r   r:     s    zSignature.bind_partialc       	      C   s   g  } d } x t  |  j j    D]h \ } } t |  } | j } | t k rX d } n% | t k r} | r} | j d  d } | j |  q" Wd j d j	 |   } |  j
 t k	 r t |  j
  } | d j |  7} | S)NTFrf   z({0})z, z -> {0})r}   r   r-   ra   r   r>   r`   ru   r(   joinr~   rL   r   )	rP   resultZrender_kw_only_separatorr   rF   rg   r   ZrenderedZannor   r   r   rR     s     "		zSignature.__str__)z_return_annotationz_parameters)r   r   rJ   rK   ro   r   r   r   r   rL   rp   r%   classmethodr3   rq   r   r~   rI   r.   rj   rm   rn   r   r   r:   rR   r   r   r   r   r	     s$   %I)'rK   Z
__future__r   r   r   r   r4   rb   r)   collectionsr   ImportErrorZfuncsigs.odictZfuncsigs.versionr   __all__r   r#   Z_WrapperDescriptorallZ_MethodWrapperr@   r   r   r   r
   objectrI   rL   rN   rM   r/   r_   r>   r`   r=   r   r   r	   r   r   r   r   <module>   s<   |a