o
    Zhz1                     @   s   d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZmZmZ dZdddZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZd ddZdS )!z,Utilities and wrappers around inspect module    )print_functionN)is_text_stringbuiltinsget_meth_funcget_meth_class_instget_meth_classget_func_defaultsto_text_stringPY2z[^\'\"a-zA-Z0-9_.]Fc                 C   s   d}dD ]\}}|  |r | |}|r | |d }| d| } qtt| }d}zF|du s4tt|rB| }|du s4tt|s4| drM|dd }|drUW dS |rd|| | |t|  7 }||7 }|rm|W S W dS  t	yy   Y dS w )z+Return the last valid object name in string )z[]()N.)
endswithrfindresplitSYMBOLSmatchpop
startswithlen
IndexError)txtlastZtxt_endZ	startcharZendcharpostokenstoken r   V/var/www/html/lang_env/lib/python3.10/site-packages/spyder_kernels/utils/dochelpers.pygetobj   s6   



r    c                 C   s   dd t | D S )z
    For standard objects, will simply return dir(obj)
    In special cases (e.g. WrapITK package), will return only string elements
    of result returned by dir(obj)
    c                 S   s   g | ]}t |r|qS r   )r   ).0itemr   r   r   
<listcomp><       zgetobjdir.<locals>.<listcomp>)dirobjr   r   r   	getobjdir6   s   r(   c                 C   s$  t | pt | pd}zt|}W n   Y ddd|d}t| rz| j}W n ty7   ||d< | Y S w t | r^t| }t	| durRdt	| j
j |d< nd|j |d< t| } nt| drkd	| j |d< nd
|d< | j|d< t | rtrt | \}}}}t j||||dd d|d< n!zt | }	W n ty   t|d }	|	sd}	Y nw t|	|d< |dkr|d |d< |d dd |d< n7t|d }
|
r|
|d< |d |d  }|d d}|d  }||kr|d |dd |d< nd|d< |d }
|
dddd|d< |S )ac  
    Return text documentation from an object. This comes in a form of
    dictionary with four keys:

    name:
      The name of the inspected object
    argspec:
      It's argspec
    note:
      A phrase describing the type of object (function or method) we are
      inspecting, and the module it belongs to.
    docstring:
      It's docstring
    r   )nameargspecnote	docstringr,   NzMethod of %s instancer+   zUnbound %s method
__module__zFunction of %s moduleFunctionr)   c                 S   s   dt |  S )N=)repr)or   r   r   <lambda>y   s    zgetdoc.<locals>.<lambda>)formatvaluer*   z(...)z<lambda>z lambda    r   

r   z(self)r   z(self, ()inspectgetdocgetcommentsr	   callable__name__AttributeErrorismethodr   r   	__class__r   hasattrr-   
isfunctionr
   
getargspecformatargspec	signature
ValueErrorgetargspecfromtextstrr   stripreplacelstrip)r'   r,   docr)   Zimclassargsvarargsvarkwdefaultssigr*   rC   Zdocstring_blocksfirst_blockr   r   r   r8   ?   s   









r8   c              	   C   sr   z,zt t| }W |W S  ty,   t| dr$t t| j}Y |W S t| }Y |W S w  ttfy8   Y dS w )z Wrapper around inspect.getsourcer>   N)r	   r7   	getsource	TypeErrorr?   r>   r8   IOError)r'   srcr   r   r   rQ      s   

rQ   c           	         s   t | tr| dd} d}|r|| }nd}|| }| sd} t|| }d}|rytr:|r2|d }|S |d d }|S ddg |rW fd	d
|D }|rQ|d }|S |d }|S dd
 |D }|ry fdd
|D }|rs|d d }|S |d d }|S )z;Get object signature from text (i.e. object documentation).r,   r   z	(\(.+?\))z(\w+)r   r4   z(*args, **kwargs)z(self, /, *args, **kwargs)c                    s   g | ]}| vr|qS r   r   r!   sZdefault_ipy_sigsr   r   r#      r$   z(getsignaturefromtext.<locals>.<listcomp>c                 S   s   g | ]
}|d    r|qS )r   )isidentifierrU   r   r   r   r#      s    c                    s   g | ]
}|d   vr|qS )r4   r   rU   rW   r   r   r#      s    )
isinstancedictgetr   findallr
   )	textobjnameZargs_reZsignature_reZidentifier_reZsigsrO   Z	real_sigsZ
valid_sigsr   rW   r   getsignaturefromtext   sJ   

##
r_   c                 C   s(   |  d}|d  dd}t|dS )z
    Try to get the formatted argspec of a callable from the first block of its
    docstring.
    
    This will return something like `(x, y, k=1)`.
    r5   r   
r   )r   rG   rH   r_   )r]   blocksrP   r   r   r   rE      s   

rE   c                 C   s2   t | |}|r||dd d }|dS dS )z/Get arguments from text (object documentation).r6   r4   r   ,N)r_   findr   )r]   r^   rC   Zargtxtr   r   r   getargsfromtext  s
   

rd   c                 C   s   | j durt| j | jS dS )zGet arguments from object docN)__doc__rd   r;   r&   r   r   r   getargsfromdoc
  s   
rf   c           	      C   sH  t | s
t | r| }nt | rt| }nt | r't| dr't| d}ng S t|ds<t|}|dur8|S t| S t 	|j
\}}}|sKt| S t|D ]\}}t|tradd| ||< qOt|}|durt|D ]\}}||t| t|   dt| 7  < qnt | st | rt|dkrdS d|v r|d |S )	z:Get the names and default values of a function's arguments__init____code__Nz(%s), r/   r4   self)r7   r@   	isbuiltinr=   r   isclassr?   getattrrf   getargsrh   	enumeraterY   listjoinr   r   r0   remove)	r'   Zfunc_objrK   _i_argargrN   indexdefaultr   r   r   rn     s:   



*
rn   Tc                 C   s   t | }|rbd}d}t|D ]2\}}|du rdg}|d  |7  < |t|d k r@|d  |7  < t|d dks;|r@|d qt| sKt| r`t|dkrSdS d| |v r`|d|  |S dS )z
    Get the names and default values of a function's arguments
    Return list with separators (', ') formatted for calltips
    ri   Nr   r   r4       rj   )rn   ro   r   appendr7   rl   r=   rr   )r'   Zone_arg_per_linerK   sepZtextlistrt   ru   r   r   r   	getargtxt=  s(   
r{   c                 C   s"  |du rt  }| d}|d}t|dkrdS |tjvrH||vrH|rFzt|t |}|t vr6|t |< |||< W n tyE   Y dS w dS |D ]D}zt	t
||| }W n tttfye   Y  dS w |r|rzt|d | t | W n ttfy   Y  dS w  dS |d| 7 }qJdS )z_Return True if object is defined in namespace
    If namespace is None --> namespace = locals()Nr   r   FT)localsr   r   r   r   __dict__
__import__globals	Exceptionr?   evalr<   SyntaxErrorrR   ImportError)r'   Zforce_import	namespaceZ	attr_listbasemoduleattrZattr_not_foundr   r   r   	isdefinedV  sB   



r   )F)T)FN)re   
__future__r   r7   r   Zspyder_kernels.py3compatr   r   r   r   r   r   r	   r
   r   r    r(   r8   rQ   r_   rE   rd   rf   rn   r{   r   r   r   r   r   <module>   s"   (
	fA
-