B
    \ q                 @   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mZ ddl	m
Z
 ddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ eeZedejZerdd Zndd Zyddl Z W n e!k
r   dZ Y nX dd Z"dd Z#dd Z$dd Z%d5ddZ&dd Z'dd Z(dd Z)dd  Z*de*fd!d"Z+d#d$ Z,d%d& Z-G d'd( d(e.Z/G d)d* d*e.Z0ej1d+krej2Z3nd,d- Z4d.d/ Z5d0d1 Z3e*d2fd3d4Z2dS )6z
    sphinx.util.inspect
    ~~~~~~~~~~~~~~~~~~~

    Helpers for inspecting Python modules.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )absolute_importN)OrderedDict)partial)PY2PY3StringIObinary_typestring_types
itervalues)builtins)force_decode)logging)NoneTypez at 0x[0-9a-f]{8,16}(?=>)c          	   C   sj  t | tr,t| dr,t| dr,td| t| }g }d}d}g }d}i }d}i }|j|jk	rl|j|d< x|j	
 D ]}	|	j}
|	j}|
tjjkr|| n|
tjjkr|| |	j|	jk	r||	jf7 }nV|
tjjkr|}nD|
tjjkr|| |	j|	jk	r&|	j||< n|
tjjkr&|}|	j|	jk	rx|	j||< qxW |sJd}|sTd}t|||||||S )zTLike inspect.getfullargspec but supports bound methods, and wrapped
        methods.__new____init__z,can't compute signature for built-in type {}N return)
isinstancetypeis_builtin_class_method	TypeErrorformatinspect	signaturereturn_annotationempty
parametersvalueskindname	ParameterPOSITIONAL_ONLYappendPOSITIONAL_OR_KEYWORDdefaultVAR_POSITIONALKEYWORD_ONLYVAR_KEYWORD
annotationZFullArgSpec)funcZsigargsvarargsvarkwZ
kwonlyargsdefaultsannotationsZ
kwdefaultsparamr   r   r   r   2lib/python3.7/site-packages/sphinx/util/inspect.py
getargspec.   sR    






r1   c       	   	   C   s  t | r| j} d}t| tkrJ| j}|dkr2i }t| j| f}| j	} t 
| s`td|  t | j\}}}| j}|dkrg }nt|}|d r||d d }|d rxH|d D ]<}||t| }||= y
||= W q tk
r   Y qX qW t ||||S )z?Like inspect.getargspec but supports functools.partial as well.)r   r   Nz%r is not a Python functionr      )r   ismethod__func__r   r   keywordslenr*   keysr)   
isfunctionr   Zgetargs__code____defaults__listindex
IndexErrorZArgSpec)	r)   partsr5   r*   r+   r,   Zfunc_defaultsargir   r   r0   r1   j   s6    



c             C   s"   t dkrdS t| o t| t jS )z(Check if the object is subclass of enum.NF)enumr   isclass
issubclassEnum)xr   r   r0   isenumclass   s    rF   c             C   s   t dkrdS t| t jS )z)Check if the object is attribute of enum.NF)rA   r   rD   )rE   r   r   r0   isenumattribute   s    rG   c             C   s
   t | tS )zCheck if the object is partial.)r   r   )objr   r   r0   	ispartial   s    rI   c             C   s<   t | trdS t| r8t| ddr(dS t| ddr8dS dS )z#Check if the object is classmethod.TZim_selfN__self__F)r   classmethodr   r3   getattr)rH   r   r   r0   isclassmethod   s    

rM   c             C   sT   t | trdS |rP|rPx8t|d|gD ]&}|j|}|r&t |trHdS dS q&W dS )z$Check if the object is staticmethod.T__mro__F)r   staticmethodrL   __dict__get)rH   clsr   Zbaseclsmethr   r   r0   isstaticmethod   s    

rT   c             C   s(   x"dD ]}t t| |ddrdS qW dS )z/Check if the object is some kind of descriptor.)__get____set__
__delete__N__call__TF)hasattrsafe_getattr)rE   itemr   r   r0   isdescriptor   s    
r\   c             C   s   t | pt| ot | jS )z Check if the object is function.)r   r8   rI   r)   )rH   r   r   r0   r8      s    r8   c             C   s   t | pt| ot | jS )zCheck if the object is builtin.)r   	isbuiltinrI   r)   )rH   r   r   r0   r]      s    r]   c             G   s^   yt | |f| S  tk
rX   y
| j| S  tk
r>   Y nX |rL|d S t|Y nX dS )z;A getattr() that turns all exceptions into AttributeErrors.r   N)rL   	ExceptionrP   AttributeError)rH   r   Zdefargsr   r   r0   rZ      s    
rZ   c          	   C   sd   g }xRt | D ]F}y|| |d}W n tk
r8   wY nX |rF||r|||f qW |  |S )z;A version of inspect.getmembers() that uses safe_getattr().N)dirr_   r"   sort)objectZ	predicateZattr_getterZresultskeyvaluer   r   r0   safe_getmembers   s    re   c                s   t  trLyt }W n tk
r*   Y n"X  fdd|D }dd| S t  tryt }W n tk
rv   Y n&X trdnd}|ddd |D  S yt }W n tk
r   t	Y nX t |t
rt|d}td|}|d	d
S )zFA repr() implementation that returns text safe to use in reST context.c             3   s&   | ]}d t |t  | f V  qdS )z%s: %sN)object_description).0rc   )rb   r   r0   	<genexpr>  s   z%object_description.<locals>.<genexpr>z{%s}z, z	set([%s])c             s   s   | ]}t |V  qd S )N)rf   )rg   rE   r   r   r0   rh     s   N 
 )r   dictsortedr^   joinsetr   r   repr
ValueErrorr   r   memory_address_resubreplace)rb   Zsorted_keysitemsZsorted_valuestemplatesr   )rb   r0   rf     s0    





rf   c                sT    fddt | D }|r$|d nt}ttt|dds>dS ttt|dd|kS )zIf attr_name is implemented at builtin class, return True.

        >>> is_builtin_class_method(int, '__init__')
        True

    Why this function needed? CPython implements int.__init__ by Descriptor
    but PyPy implements it by pure Python code.
    c                s   g | ]} |j kr|qS r   )rP   )rg   c)	attr_namer   r0   
<listcomp>/  s    z+is_builtin_class_method.<locals>.<listcomp>r   __name__ri   F)r   Zgetmrorb   rY   r   rZ   rL   )rH   ry   classesrR   r   )ry   r0   r   %  s
    
r   c               @   s8   e Zd ZdZdZdZdZdZdZe	 Z
ee
fddZd	S )
r    z!Fake parameter class for python2.r   r2            c             C   s   || _ || _|| _| j| _d S )N)r   r   r$   r   r(   )selfr   r   r$   r   r   r0   r   @  s    zParameter.__init__N)r{   
__module____qualname____doc__r!   r#   r%   r&   r'   rb   r   r   r   r   r   r0   r    7  s   r    c               @   sR   e Zd ZdZdddZedd Zedd	 Zd
d Zdd Z	dd Z
dd ZdS )	SignaturezkThe Signature object represents the call signature of a callable object and
    its return annotation.
    FTc             C   s   t |tr,t|dr,t|dr,td||| _|| _d| _tryt	
|| _
W q tk
r   t|drzd | _
d| _n Y qX n
t|| _yt|| _W n tk
r   i | _Y nX |rtrt	|rd| _qd| _ntrd| _nt	|o|j| _d S )Nr   r   z,can't compute signature for built-in type {}F_partialmethodT)r   r   r   r   r   subject
has_retvalpartialmethod_with_noargsr   r   r   r=   rY   r1   argspectypingget_type_hintsr.   r^   r3   skip_first_argumentrJ   )r   r   Zbound_methodr   r   r   r0   r   M  s6    





zSignature.__init__c             C   s   t r| jri S | jjS nt }t| jjt| jj }xNt	| jjD ]>\}}||k rbt
|||< qD| jj||  }t
||d||< qDW | jjrt
| jjt
j|| jj< | jjrt
| jjt
j|| jj< |S d S )N)r$   )r   r   r   r   r   r6   r   r*   r-   	enumerater    r+   r%   r5   r'   )r   paramsZpositionalsr@   r?   r$   r   r   r0   r     s$    
zSignature.parametersc             C   s*   t r"| jr"| jr| jjS tjjS nd S d S )N)r   r   r   r   r   r    r   )r   r   r   r0   r     s
    

zSignature.return_annotationc             C   s  g }d }xt t| jD ]\}}| jr4|dkr4qt }|j|jkrb||j|jd fkrb|	d |j|j|j|jfkr>|
|j |j|jk	rt|jtr|j| jkr|
d |
| | j|j  n|
d |
| |j |j|jk	r|j|jkr"|
d |
t|j n|
d |
t|j nJ|j|jkrd|
d |
|j n$|j|jkr|
d |
|j |	|  |j}qW ts| jtjjkrdd| S d	| jkr| | jd	 }n| | j}d
d||f S d S )Nr   *z: =z = z**z(%s)z, r   z
(%s) -> %s)r   r
   r   r   r   r   r&   r#   r!   r"   writer   r(   r   r   r	   r.   format_annotationr$   rf   r%   r'   getvaluer   r   r   r    rn   )r   r*   Z	last_kindr@   r/   r?   r(   r   r   r0   format_args  sR    







zSignature.format_argsc             C   s|   t |tr|S t |tjr |jS |s,t|S |tkr8dS t|dddkrN|jS |t	krZdS t
jdkrn| |S | |S dS )zReturn formatted representation of a type annotation.

        Show qualified names for types and additional details for types from
        the ``typing`` module.

        Displaying complex types from ``typing`` relies on its private API.
        Noner   Nr   z...)r~      )r   r	   r   ZTypeVarr{   rp   r   rL   r   Ellipsissysversion_infoformat_annotation_newformat_annotation_old)r   r(   r   r   r0   r     s    	


zSignature.format_annotationc                sb  t |dd}|dkr^t |ddr(|j}qt |ddr<|j}qt |ddrP|j}q |j}n"t|drxd||jf }nt|}t |ddr^|d	krt|j	d
kr|j	d t
krd |j	d  S d fdd|j	D }d||f S np|dkr8d fdd|j	dd D } |j	d }d|||f S d fdd|j	D }d||f S |S )zformat_annotation() for py37+r   Nr   _namer   __forward_arg__z%s.%s__args__Unionr}   r2   zOptional[%s]r   z, c             3   s   | ]}  |V  qd S )N)r   )rg   a)r   r   r0   rh     s    z2Signature.format_annotation_new.<locals>.<genexpr>z%s[%s]Callablec             3   s   | ]}  |V  qd S )N)r   )rg   r   )r   r   r0   rh     s    z%s[[%s], %s]c             3   s   | ]}  |V  qd S )N)r   )rg   r   )r   r   r0   rh     s    )rL   r   r   r   r   
__origin__rY   rp   r6   r   r   rn   )r   r(   modulequalnamer*   Zreturnsr   )r   r0   r     s2    

"zSignature.format_annotation_newc                s  t |dd}|dkr|t |ddr(|j}qt |ddr<|j}qt |ddrP|j}qt |ddrj |j}qt|dd	}n"t|drd
||jf }nt|}tt	drt
|t	jrt|ds|j}d fdd|D }d||f S tt	drt
|t	jrd}t|drx|jdks.t|jdkr6|j}n@d fdd|jdd D } |jd }d|||f S nt|dr|j}|dk	rd fdd|D }d||f S ntt	drHt
|t	jrHt|drH|j}|dk	rt|dkr |d tkr d |d  S d fdd|D }d||f S ntt	drt|dr|jt	jkr|j}|dk	rt|dkr|d tkrd |d  S d fd d|D }d!| S n
tt	d"rbt
|t	jrbt |dddk	rbt|d#rb|j}|dkr|S |tkr,d$}n  fd%d|D }	d&d|	 }d'|| |jf S tt	drt
|t	jrt|drt|d(r|j}|dk	rڇ fd)d*|D }
|jr|
d$ d|d|
f S |S )+z%format_annotation() for py36 or belowr   Nr   r   r   r   r   ztyping.ri   z%s.%s	TupleMeta__tuple_params__z, c             3   s   | ]}  |V  qd S )N)r   )rg   p)r   r   r0   rh   5  s    z2Signature.format_annotation_old.<locals>.<genexpr>z%s[%s]GenericMetar   r}   c             3   s   | ]}  |V  qd S )N)r   )rg   r?   )r   r   r0   rh   C  s    r   z%s[[%s], %s]__parameters__c             3   s   | ]}  |V  qd S )N)r   )rg   r   )r   r   r0   rh   J  s    	UnionMeta__union_params__r2   zOptional[%s]r   c             3   s   | ]}  |V  qd S )N)r   )rg   r   )r   r   r0   rh   T  s    r   c             3   s   | ]}  |V  qd S )N)r   )rg   r   )r   r   r0   rh   ^  s    z	Union[%s]CallableMeta
__result__z...c             3   s   | ]}  |V  qd S )N)r   )rg   r   )r   r   r0   rh   k  s    z[%s]z
%s[%s, %s]__tuple_use_ellipsis__c                s   g | ]}  |qS r   )r   )rg   r   )r   r   r0   rz   v  s    z3Signature.format_annotation_old.<locals>.<listcomp>)rL   r   r   r   r   r   rp   rt   rY   r   r   r   r   rn   r   r6   r   r   r   r   r   r   r   r   r   r   r"   )r   r(   r   r   r   Z	param_strr*   resultZargs_strZformatted_argsZparam_stringsr   )r   r0   r     s    









zSignature.format_annotation_oldN)FT)r{   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r0   r   H  s   
49#r   )r~      c             C   sf   t j| j}|d krd S t| dr,| j}n(x&| jdd d D ]}t||}qBW t	
|sbd S |S )Nim_class.r   )r   modulesrQ   r   rY   r   r   splitrL   r   rB   )r)   rR   r   r   r   r0   
_findclass  s    

r   c          	   C   s  t | rTxD| jD ]:}|tk	ry
|j}W n tk
r>   wY nX |d k	r|S qW d S t | rt| dd r| jj	}| j
}t |rtt||d d| jkr|}n|j}nt | st | r| j	}t| }|d kst||| krd S nt | r0| j	}| j
}t |r(|jd | | jkr(|}n|j}n~t| trp| j}|j	}t|}|d ksjt||| k	rd S n>t | st | r| j	}| j}t||| k	rd S nd S xJ|jD ]@}yt||j}W n tk
r   wY nX |d k	r|S qW d S )NrJ   r4   r   )r   rB   rN   rb   r   r_   r3   rL   r4   r{   rJ   	__class__r8   r   r]   r   r   r   fgetZismethoddescriptorZisdatadescriptor__objclass__)rH   basedocr   r   rR   r)   r   r   r0   _finddoc  sd    






r   c          	   C   sf   y
| j }W n tk
r   dS X |dkrNyt| }W n ttfk
rL   dS X t|ts\dS t|S )a  Get the documentation string for an object.

        All tabs are expanded to spaces.  To clean up docstrings that are
        indented to line up with blocks of code, any whitespace than can be
        uniformly removed from the second line onwards is removed.N)r   r_   r   r   r   strr   Zcleandoc)rb   r   r   r   r0   _getdoc  s    

r   Fc             C   sB   || dd}t | r*|| jjkr*t| jS |dkr>|r>t| }|S )zGet the docstring for the object.

    This tries to obtain the docstring for some kind of objects additionally:

    * partial functions
    * inherited docstring
    r   N)rI   r   r   getdocr)   r   )rH   
attrgetterZallow_inheritedr   r   r   r0   r     s    	
r   )NN)6r   Z
__future__r   r   rer   r   collectionsr   	functoolsr   Zsixr   r   r   r   r	   r
   Z	six.movesr   Zsphinx.utilr   r   Zsphinx.util.pycompatr   Z	getLoggerr{   Zloggercompile
IGNORECASErr   r1   rA   ImportErrorrF   rG   rI   rM   rT   r\   r8   r]   rZ   re   rf   r   rb   r    r   r   r   r   r   r   r   r   r   r0   <module>
   sV    


< 

	"  9=