
|V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 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   z0.4BoundArguments	Parameter	Signature	signaturec             C   sJ   t  |  t  r@ |  j d d | f k r. |  j S|  j d |  j St |   S)Nbuiltins__builtin__.)
isinstancetype
__module____name__repr)
annotationbase_module r   U/s/python-3.5.2/amd64_ubu14/lib/python3.5/site-packages/sklearn/externals/funcsigs.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)cls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
parametersr   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tuple__signature__r   __wrapped__FunctionTyper	   from_function	functoolspartialfuncr   itemsargskeywordsbind_partial
ValueError	argumentsr!   _VAR_KEYWORD_VAR_POSITIONALr$   popr   r    r   BuiltinFunctionType)objsigfirstwrapped
new_paramspartial_argspartial_keywordsbaexmsgZarg_name	arg_valueparamcallnew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   rS      s   rS   c               @   s   e  Z d  Z d S)_emptyN)r   r   rT   r   r   r   r   rV      s   rV   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)selfr;   kwargsrD   r   r   r   r&      s    z_ParameterKind.__new__c             C   s   |  j  S)N)rY   )rZ   r   r   r   __str__   s    z_ParameterKind.__str__c             C   s   d j  |  j  S)Nz<_ParameterKind: {0!r}>)r*   rY   )rZ   r   r   r   __repr__   s    z_ParameterKind.__repr__N)r   r   rT   r&   r\   r]   r   r   r   r   rW      s   rW   r   POSITIONAL_ONLY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`.
    rY   _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)r1   _POSITIONAL_OR_KEYWORDrA   _KEYWORD_ONLYr@   r>   rf   rV   r*   rg   rh   rY   strrematchIr$   )rZ   r   r!   r#   r   r$   rM   r   r   r   r'      s(    				%	zParameter.__init__c             C   s   |  j  S)N)rY   )rZ   r   r   r   r   
  s    zParameter.namec             C   s   |  j  S)N)rg   )rZ   r   r   r   r#     s    zParameter.defaultc             C   s   |  j  S)N)rh   )rZ   r   r   r   r     s    zParameter.annotationc             C   s   |  j  S)N)rf   )rZ   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$   )rS   rY   rf   rh   rg   r$   r   )rZ   r   r!   r   r#   r$   r   r   r   r0     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!   rY   r1   r*   rh   rV   r   rg   r   rA   r@   )rZ   r!   	formattedr   r   r   r\   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   )rZ   r   r   r   r]   H  s    zParameter.__repr__c             C   s%   d j  |  j j  } t |   d  S)Nzunhashable type: '{0}')r*   rr   r   r)   )rZ   rM   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)
issubclassrr   r   rY   rf   rg   rh   )rZ   otherr   r   r   __eq__P  s
    zParameter.__eq__c             C   s   |  j  |  S)N)rw   )rZ   rv   r   r   r   __ne__W  s    zParameter.__ne__N)z_namez_kindz_defaultz_annotationz_partial_kwarg)r   r   rT   rU   	__slots__r1   r^   ri   r_   rA   ra   rj   rc   r@   re   rV   emptyr'   propertyr   r#   r   r!   rS   r0   r\   r]   rt   rw   rx   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)rZ   r
   r?   r   r   r   r'   l  s    	zBoundArguments.__init__c             C   s   |  j  S)N)r|   )rZ   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)r|   r"   r:   r!   r@   rj   r$   r?   KeyErrorrA   extendappendr2   )rZ   r;   
param_namerO   argr   r   r   r;   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)
r|   r"   r:   r!   r@   rj   r$   r?   r}   update)rZ   r[   kwargs_startedr   rO   r   r   r   r   r[     s(    		zBoundArguments.kwargsc             C   s%   d j  |  j j  } t |   d  S)Nzunhashable type: '{0}')r*   rr   r   r)   )rZ   rM   r   r   r   rt     s    zBoundArguments.__hash__c             C   s4   t  | j t  o3 |  j | j k o3 |  j | j k S)N)ru   rr   r   r
   r?   )rZ   rv   r   r   r   rw     s    zBoundArguments.__eq__c             C   s   |  j  |  S)N)rw   )rZ   rv   r   r   r   rx     s    zBoundArguments.__ne__N)r   r   rT   rU   r'   r{   r
   r;   r[   rt   rw   rx   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   ).0rO   r   r   r   	<genexpr>  s   z%Signature.__init__.<locals>.<genexpr>)r   r1   	enumerater!   r*   r>   r   rk   r0   r   r   )rZ   r"   return_annotation__validate_parameters__paramstop_kindidxrO   r!   rM   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#   rd      r   r   returnr   F)r   r+   r5   r)   r*   _parameter_cls__code__co_argcountco_varnamesr2   r   __defaults__lengetrV   r   ri   r   co_flagsrA   rj   r@   )r   r9   r   	func_code	pos_count	arg_names
positionalkeyword_only_countkeyword_onlyannotationsdefaults
kwdefaultspos_default_countr"   non_default_countr   r   offsetr#   indexr   r   r   r6      sd    					
#




	zSignature.from_functionc             C   s@   y t  j |  j  SWn% t k
 r; t |  j j    SYn Xd  S)N)r+   MappingProxyTyper   r   r   r:   )rZ   r   r   r   r"   I  s    zSignature.parametersc             C   s   |  j  S)N)r   )rZ   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   )rS   r"   r/   r   r   )rZ   r"   r   r   r   r   r0   T  s    	zSignature.replacec             C   s%   d j  |  j j  } t |   d  S)Nzunhashable type: '{0}')r*   rr   r   r)   )rZ   rM   r   r   r   rt   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   rO   r   r   r   r   m  s   z#Signature.__eq__.<locals>.<genexpr>T)ru   r   r	   r   r   r"   dictr   keysr:   r!   rj   r}   )rZ   rv   Zother_positionsr   r   rO   Zother_paramZ	other_idxr   r   r   rw   g  s,    (		zSignature.__eq__c             C   s   |  j  |  S)N)rw   )rZ   rv   r   r   r   rx     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 keywordr   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/   r:   r$   r#   nextStopIterationr!   rA   r   r1   r*   r)   r@   rV   rj   r~   r2   	itertoolschainrB   r}   _bound_arguments_cls)rZ   r;   r[   r8   r?   r"   parameters_exarg_valsr   rO   arg_valrM   r/   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   )rZ   r;   r[   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.
        r8   T)r   )rZ   r;   r[   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)NTFrp   z({0})z, z -> {0})r   r"   r/   rk   r!   rA   rj   r   r*   joinr   rV   r   )	rZ   resultrender_kw_only_separatorr   rO   rq   r!   renderedannor   r   r   r\     s     "		zSignature.__str__)z_return_annotationz_parameters)r   r   rT   rU   ry   r   r   r   r   rV   rz   r'   classmethodr6   r{   r"   r   rS   r0   rt   rw   rx   r   r   r=   r\   r   r   r   r   r	     s$   %I)&rU   
__future__r   r   r   r   r7   rl   r+   collectionsr   ImportErrorodict__version____all__r   r%   _WrapperDescriptorall_MethodWrapperrC   r   r   r    r
   objectrS   rV   rX   rW   r1   ri   rA   rj   r@   r   r   r	   r   r   r   r   <module>   s<   |a