U
    -eS+                     @   s   d Z ddlZddlmZmZmZmZmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddd	d
dddddddddddgZd&ddZdd Zd'ddZdd
 Zd(ddZdd Zd)ddZd*ddZd+d dZd!d Zd,d"dZd-d#dZd.d$d	Zd/d%dZdS )0z=
Methods for detecting objects leading to pickling failures.
    N)ismethod
isfunctionistracebackisframeiscode   )parent	referenceatparentschildren)tracebaditems
badobjectsbadtypescodeerrorsfreevars	getmodule
globalvars
nestedcodenestedglobals	outermostreferredglobalsreferrednestedr   varnamesFc                 C   sZ   ddl m} || |}|s|s"|S ddl}ddlm} || dd}|t| krV|S dS )zget the module of the objectr   )r   Nr   )getnameT)force)inspectr   builtinssourcer   varskeys)object	_filenamer   Zgetmodmoduler   r   name r'   L/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/dill/detect.pyr      s    
 c              	      s   t | r| jjpi }nt| r*| jp&i }ndS | }ddlm} z|| dd\}}W n tk
rt   g d }}Y nX d|  fdd|D }|D ]<\}}z||||fkr|W   S W q tk
r   Y qX qdS )	zget outermost enclosing object (i.e. the outer function in a closure)

    NOTE: this is the object-equivalent of getsource(func, enclosing=True)
    Nr   )getsourcelinesT)Z	enclosing c                 3   s"   | ]\}}| kr||fV  qd S Nr'   ).0r&   objr   r'   r(   	<genexpr>3   s      zoutermost.<locals>.<genexpr>)	r   __func____globals__r   itemsr    r)   	Exceptionjoin)funcZ_globalsr)   lineslnumZ_localsr&   r-   r'   r.   r(   r       s(     
 Tc                 C   sf   t | } t| sg S t }| jD ]<}|dkr.q t |}|r || |r |tt|ddO }q t|S )zAget the code objects for any nested functions (e.g. in a closure)NTrecurse)r   r   set	co_constsaddr   list)r5   r9   nestedcor'   r'   r(   r   <   s     
 
 c                 C   sH   t | r| j} t| r| j} t| r*| j} t| r8| j} t| rD| S dS )z~get the code object for the given function or method

    NOTE: use dill.source.getsource(CODEOBJ) to get the source code
    N)	r   r0   r   __code__r   tb_framer   f_coder   r5   r'   r'   r(   r   I   s         c                 C   s   ddl }t }t| |D ]}||D ]}t|dd}t|dd|krR|| q&t|dd|krn|| q&t|dd|kr|| q&t|dr&||kr&|| q&qt|S )aJ  get functions defined inside of func (e.g. inner functions in a closure)

    NOTE: results may differ if the function has been executed or not.
    If len(nestedcode(func)) > len(referrednested(func)), try calling func().
    If possible, python builds code objects, but delays building functions
    until func() is called.
    r   Nr0   r@   rB   co_code)gcr:   r   Zget_referrersgetattrr<   hasattrr=   )r5   r9   rE   funcsr?   r-   _r'   r'   r(   r   V   s        c                    sF   t rjtr*jpd jjni S  fdd}t| S )zgget objects defined in enclosing code that are referred to by func

    returns a dict of {name:object}r'   c               	   3   sH   t  D ]8\} }z
|j}W n tk
r4   Y q
Y nX | |jfV  q
d S r+   )zipcell_contents
ValueError)r&   crK   Zclosuresr5   r'   r(   get_cell_contents   s    

z#freevars.<locals>.get_cell_contents)r   r0   r   __closure__r@   co_freevarsdict)r5   rO   r'   rN   r(   r   u   s     

c           
   	   C   s   t | } | dkrt S ddl}ddlm} |jdk}t }|d}t|  W 5 Q R X | 	 D ]F}d|krd|
dd	 
d
d }|r||dd qd|| qdt| dt D ]&}	|	r|rt|	r|t|	dd qt|S )z.get the names of any globals found within funcNr   r   )capturei stdoutZ_GLOBAL()zNULL + r*   r;   Tr8   )r   r=   systemprS   
hexversionr:   disgetvalue
splitlinessplitr<   replacerF   tupler   updater   )
r5   r9   rX   rS   ZCAN_NULLnamesoutliner&   r?   r'   r'   r(   r      s&     

c                 C   s   t | || S )z@get the names of objects in the global scope referred to by func)r   r"   )r5   r9   builtinr'   r'   r(   r      s    c           	   	      s  t | r| j} t| r|r*ttt ni  | t  }} |jpBi D ]H}z
|j	}W n t
k
rf   Y qDX t|||pvi }| |  | qD |jpi  |s| |jj nD| t|j |  D ]*} |}||krq| t|d| qnt| rx|rttt ni  |s*| j} nL| j}tt| } |  D ]0}||krVqD |}| t|d| qDni S t fdd| D S )zdget objects defined in global scope that are referred to by func

    return a dict of {name:object}Tc                 3   s"   | ]}| kr| | fV  qd S r+   r'   )r,   r&   Zglobsr'   r(   r/      s      zglobalvars.<locals>.<genexpr>)r   r0   r   r!   r   sumcopyr:   rP   rK   rL   r   ra   r1   r@   co_namesr   getr   co_namerR   )	r5   r9   re   Z	orig_funcr-   rK   Z_varskeyZnested_funcr'   rf   r(   r      sF     





c                 C   s    t | } t| sdS | j| jfS )ztget names of variables defined by func

    returns a tuple (local vars, local vars referrenced by nested functions)r'   )r   r   co_varnamesco_cellvarsrC   r'   r'   r(   r      s    c                    sd   t | ds$dd t| dfD S t| ddr8|  n| } g   fdd| D  dd  D S )	z'get items in object that fail to pickle__iter__c                 S   s   g | ]}|d k	r|qS r+   r'   r,   jr'   r'   r(   
<listcomp>   s      zbaditems.<locals>.<listcomp>r   valuesNc              	      s(   g | ] }| kr  t|d qS )r   )appendr   )r,   i_objexactsafer'   r(   rr      s      c                 S   s   g | ]}|d k	r|qS r+   r'   rp   r'   r'   r(   rr      s      )rG   r   rF   rs   )r-   rx   ry   r'   rv   r(   r      s    
c                    sF   ddl m  s$r dS S t fddtD S )zget objects that fail to pickler   picklesNc                 3   s<   | ]4}t |s|tt | d  fV  qdS r   N)rF   r   r,   attrdepthrx   r-   r{   ry   r'   r(   r/      s    zbadobjects.<locals>.<genexpr>)dillr{   rR   dirr-   r   rx   ry   r'   r   r(   r      s     c                    sJ   ddl m  s(r dS tS t fddtD S )z)get types for objects that fail to pickler   rz   Nc                 3   s<   | ]4}t |s|tt | d  fV  qdS r|   )rF   r   r}   r   r'   r(   r/      s    zbadtypes.<locals>.<genexpr>)r   r{   typerR   r   r   r'   r   r(   r      s     c              	   C   s  ddl m}m} |szR|| }|r:|| ks:td|| f t|t| ksbtdt|t| f W dS  tk
r   ddl}| d  Y S X i }t| D ]f}	zt	| |	}
W n0 tk
r   ddl}| d ||	< Y qY nX ||
||st
|
|d ||||	< q|S )z*get errors for objects that fail to pickler   )r{   rh   z$Unpickling produces %s instead of %sNr   )r   r{   rh   AssertionErrorr   r3   rX   exc_infor   rF   r   )r-   r   rx   ry   r{   rh   ZpikrX   _dictr~   Z_attrr'   r'   r(   r      s4    


)NF)T)T)T)TF)TF)FF)r   FF)r   FF)r   FF)__doc__r[   r   r   r   r   r   r   Zpointersr   r	   r
   r   r   loggerr   __all__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   s:          






5



	
	