o
    ={c6                     @   sN  d Z ddlZddlZddlZddlm  mZ ej	Z	e
edr#ejZnedg dZdd Ze
edr<ejZdd	 Znej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 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. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d=d:d;Z'dS )>z6TFDecorator-aware replacements for the inspect module.    NFullArgSpecargsvarargsvarkwdefaults
kwonlyargskwonlydefaultsZannotationsc              	   C   s,   t | tr| S t| j| j| j| jg d i dS )Nr   )
isinstancer   r   r   keywordsr   )argspec r   6lib/python3.10/site-packages/keras/utils/tf_inspect.py%_convert_maybe_argspec_to_fullargspec*   s   
r   getfullargspecc                 C   s$   t | }t|j|j|j|jd}|S )a  A python3 version of getargspec.

        Calls `getfullargspec` and assigns args, varargs,
        varkw, and defaults to a python 2/3 compatible `ArgSpec`.

        The parameter name 'varkw' is changed to 'keywords' to fit the
        `ArgSpec` struct.

        Args:
          target: the target object to inspect.

        Returns:
          An ArgSpec with args, varargs, keywords, and defaults parameters
          from FullArgSpec.
        )r   r   r   r   )r   ArgSpecr   r   r   r   )targetZfullargspecsZargspecsr   r   r   _getargspec;   s   r   c                 C   s   t t| S )zA python2 version of getfullargspec.

        Args:
          target: the target object to inspect.

        Returns:
          A FullArgSpec with empty kwonlyargs, kwonlydefaults and annotations.
        )r   
getargspec)r   r   r   r   _getfullargspecW   s   	r   c                   C   s   t  d d S )z7TFDecorator-aware replacement for inspect.currentframe.   r   _inspectstackr   r   r   r   currentframec   s   r   c                 C   s   t | tjr
t| S tjj| \}}tdd |D d}|r!|S zt	|W S  t
y/   Y nw t |trUzt	|jW S  t
yD   Y nw zt	|jW S  t
yT   Y nw t	t|jS )ad  TFDecorator-aware replacement for `inspect.getargspec`.

    Note: `getfullargspec` is recommended as the python 2/3 compatible
    replacement for this function.

    Args:
      obj: A function, partial function, or callable object, possibly decorated.

    Returns:
      The `ArgSpec` that describes the signature of the outermost decorator that
      changes the callable's signature, or the `ArgSpec` that describes
      the object if not decorated.

    Raises:
      ValueError: When callable's signature can not be expressed with
        ArgSpec.
      TypeError: For objects of unsupported types.
    c                 s   s     | ]}|j d ur|j V  qd S N)decorator_argspec).0dr   r   r   	<genexpr>   s    
zgetargspec.<locals>.<genexpr>N)r
   	functoolspartial_get_argspec_for_partialtf__internal__	decoratorunwrapnextr   	TypeErrortype__init____new____call__)obj
decoratorsr   specr   r   r   r   h   s8   

r   c                    s  t | j}| jp	i }t| j\ }}} |d  t gt   }|r.||t | d< | D ]\}}| v rD |}	|||	< q2|sJtdq2t	fddt
|D ddu rdt ||dS  fddt
|D }
|
r{td|
 dt ||t|d S )	zImplements `getargspec` for `functools.partial` objects.

    Args:
      obj: The `functools.partial` object
    Returns:
      An `inspect.ArgSpec`
    Raises:
      ValueError: When callable's signature can not be expressed with
        ArgSpec.
    NzSFunction does not have **kwargs parameter, but contains an unknown partial keyword.c                 3   s     | ]\}}| ur|V  qd S r   r   )r   idxx)
no_defaultr   r   r      s    z+_get_argspec_for_partial.<locals>.<genexpr>c                    s(   g | ]\}}|u r|kr | qS r   r   )r   ijr   Zfirst_defaultr2   r   r   
<listcomp>   s
    z,_get_argspec_for_partial.<locals>.<listcomp>zSome arguments z| do not have default value, but they are positioned after those with default values. This can not be expressed with ArgSpec.)lenr   r   r   funcobjectitemsindex
ValueErrorr'   	enumerater   tuple)r-   Zn_prune_argsZpartial_keywordsr   r   r   Zall_defaultskwdefaultr0   Zinvalid_default_valuesr   r5   r   r"      s<   
*



r"   c                 C   s<   t jj| \}}|D ]}|jdurt|j  S qt|S )a  TFDecorator-aware replacement for `inspect.getfullargspec`.

    This wrapper emulates `inspect.getfullargspec` in[^)]* Python2.

    Args:
      obj: A callable, possibly decorated.

    Returns:
      The `FullArgSpec` that describes the signature of
      the outermost decorator that changes the callable's signature. If the
      callable is not decorated, `inspect.getfullargspec()` will be called
      directly on the callable.
    N)r#   r$   r%   r&   r   r   r   )r-   r.   r   r   r   r   r   r     s   
c                     s   | d }| dd }t |}|  t|ddpt|dd}t|r)|r)|f| } fdd|jD } tt|| |jsBdnt	|j}|rbt|j| d |jD ]\}}	| vra|	 |< qU|j
dury|j
 D ]\}
}|
 vrx| |
< ql S )an  TFDecorator-aware replacement for inspect.getcallargs.

    Args:
      *func_and_positional: A callable, possibly decorated, followed by any
        positional arguments that would be passed to `func`.
      **named: The named argument dictionary that would be passed to `func`.

    Returns:
      A dictionary mapping `func`'s named arguments to the values they would
      receive if `func(*positional, **named)` were called.

    `getcallargs` will use the argspec from the outermost decorator that
    provides it. If no attached decorators modify argspec, the final unwrapped
    target's argspec will be used.
    r   r   NZim_self__self__c                    s   g | ]}| vr|qS r   r   )r   argZ	call_argsr   r   r6   .  s    zgetcallargs.<locals>.<listcomp>)r   copygetattrismethodr   updatedictzipr   r7   r	   r:   )Zfunc_and_positionalZnamedr8   Z
positionalr   thisZremaining_positionalsZdefault_countrB   valuekvr   rC   r   getcallargs  s.   

 
rN   c                  O   s   t j| i |S r   )r   getframeinfo)r   kwargsr   r   r   rO   >  s   rO   c                 C   
   t | S )a3  TFDecorator-aware replacement for inspect.getdoc.

    Args:
      obj: An object, possibly decorated.

    Returns:
      The docstring associated with the object.

    The outermost-decorated object is intended to have the most complete
    documentation, so the decorated parameter is not unwrapped.
    )r   getdocr-   r   r   r   rR   B  s   
rR   c                 C   s:   t jj| d }t|drd|jv r|jd S t|S )z2TFDecorator-aware replacement for inspect.getfile.r   	f_globals__file__)r#   r$   r%   r&   hasattrrT   r   getfile)r-   Zunwrapped_objectr   r   r   rW   Q  s   


rW   c                 C   s   t | |S )z5TFDecorator-aware replacement for inspect.getmembers.)r   
getmembers)r-   Z	predicater   r   r   rX   a  s   rX   c                 C   rQ   )z4TFDecorator-aware replacement for inspect.getmodule.)r   	getmodulerS   r   r   r   rY   f     
rY   c                 C   rQ   )z1TFDecorator-aware replacement for inspect.getmro.)r   getmro)clsr   r   r   r[   k  rZ   r[   c                 C      t tjj| d S )z4TFDecorator-aware replacement for inspect.getsource.r   )r   	getsourcer#   r$   r%   r&   rS   r   r   r   r^   p     r^   c                 C   r]   )z8TFDecorator-aware replacement for inspect.getsourcefile.r   )r   getsourcefiler#   r$   r%   r&   rS   r   r   r   r`   u  r_   r`   c                 C   r]   )z9TFDecorator-aware replacement for inspect.getsourcelines.r   )r   getsourcelinesr#   r$   r%   r&   rS   r   r   r   ra   z  r_   ra   c                 C   r]   )z4TFDecorator-aware replacement for inspect.isbuiltin.r   )r   	isbuiltinr#   r$   r%   r&   rS   r   r   r   rb     r_   rb   c                 C   r]   )z2TFDecorator-aware replacement for inspect.isclass.r   )r   isclassr#   r$   r%   r&   rS   r   r   r   rc     r_   rc   c                 C   r]   )z5TFDecorator-aware replacement for inspect.isfunction.r   )r   
isfunctionr#   r$   r%   r&   rS   r   r   r   rd     r_   rd   c                 C   r]   z3TFDecorator-aware replacement for inspect.ismodule.r   )r   isframer#   r$   r%   r&   rS   r   r   r   rf     r_   rf   c                 C   r]   )z6TFDecorator-aware replacement for inspect.isgenerator.r   )r   isgeneratorr#   r$   r%   r&   rS   r   r   r   rg     r_   rg   c                 C   r]   )z>TFDecorator-aware replacement for inspect.isgeneratorfunction.r   )r   isgeneratorfunctionr#   r$   r%   r&   rS   r   r   r   rh     s   rh   c                 C   r]   )z3TFDecorator-aware replacement for inspect.ismethod.r   )r   rF   r#   r$   r%   r&   rS   r   r   r   rF     r_   rF   c                 C   r]   re   )r   ismoduler#   r$   r%   r&   rS   r   r   r   ri     r_   ri   c                 C   r]   )z4TFDecorator-aware replacement for inspect.isroutine.r   )r   	isroutiner#   r$   r%   r&   rS   r   r   r   rj     r_   rj   r   c                 C   s   t | dd S )z0TFDecorator-aware replacement for inspect.stack.r   Nr   )contextr   r   r   r     s   r   r   )r   )(__doc__collectionsr    inspectr   Ztensorflow.compat.v2compatZv2r#   r   rV   r   
namedtupler   r   r   r   r   r   r"   rN   rO   rR   rW   rX   rY   r[   r^   r`   ra   rb   rc   rd   rf   rg   rh   rF   ri   rj   r   r   r   r   r   <module>   sT   


9`'
