
    h+                         S r SSKrSSKJrJrJrJrJr  SSKJ	r	J
r
JrJrJr  SSKJr  / SQrSS jrS	 rSS
 jrS rSS jrS rSS jrSS jrSS jrS rSS jrSS jrSS jrSS jrg)z=
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   varnamesc                     SSK Jn  U" X5      nU(       d  U(       d  U$ SSKnSSKJn  U" U SS9nU[        U5      R                  5       ;   a  U$ S$ )zget the module of the objectr   )r   Nr   )getnameT)force)inspectr   builtinssourcer   varskeys)object	_filenamer   getmodmoduler!   r   names           E/home/james-whalen/.local/lib/python3.13/site-packages/dill/detect.pyr   r      sI    +F&FU6M6&DtH~22448>$>    c                   ^ [        U 5      (       a   U R                  R                  =(       d    0 nO'[        U 5      (       a  U R                  =(       d    0 nOgUR	                  5       nSSKJn  U" U SS9u  p4SR                  U5      mU4S jU 5       nU H  u  pg U" U5      X44:X  a  Us  $ M     g! [         a    / SpC NJf = f! [         a     M<  f = f)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)	enclosing c              3   >   >#    U  H  u  pUT;   d  M  X4v   M     g 7fN ).0r)   objr   s      r*   	<genexpr>outermost.<locals>.<genexpr>3   s     EHjtzzHs   
)	r   __func____globals__r   itemsr"   r-   	Exceptionjoin)	func_globalsr-   lineslnum_localsr)   r4   r   s	           @r*   r   r       s    
 ~~==,,2	D		##)r~~H&$TT: 775>DEHEG	c"ul23J2 
   d  		s$   /	B3 C3CC
CCc           	         [        U 5      n [        U 5      (       d  / $ [        5       nU R                   HL  nUc  M  [        U5      nU(       d  M  UR	                  U5        U(       d  M6  U[        [        USS95      -  nMN     [        U5      $ )zAget the code objects for any nested functions (e.g. in a closure)Trecurse)r   r   set	co_constsaddr   list)r<   rC   nestedcos       r*   r   r   <   ss    :D$<<UFnn:x"X2JJrNw#jT&B"CC  <r+   c                    [        U 5      (       a  U R                  n [        U 5      (       a  U R                  n [	        U 5      (       a  U R
                  n [        U 5      (       a  U R                  n [        U 5      (       a  U $ g)zvget the code object for the given function or method

NOTE: use dill.source.getsource(CODEOBJ) to get the source code
N)	r   r7   r   __code__r   tb_framer   f_coder   r<   s    r*   r   r   I   s\    
 ~~dmmt$4$t}}T[[dd||D[
r+   c                    SSK n[        5       n[        X5       H  nUR                  U5       H  n[	        USS5      n[	        USS5      UL a  UR                  U5        M3  [	        USS5      UL a  UR                  U5        MV  [	        USS5      UL a  UR                  U5        My  [        US5      (       d  M  XTL d  M  UR                  U5        M     M     [        U5      $ )a6  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   Nr7   rK   rM   co_code)gcrD   r   get_referrersgetattrrF   hasattrrG   )r<   rC   rQ   funcsrI   r4   _s          r*   r   r   V   s     EE'##B'CZ.Aq*d+r1599S>j$/25uyy~h-3UYYs^i((SY		# ( (" ;r+   c                    ^ ^ [        T 5      (       a  T R                  m [        T 5      (       a,  T R                  =(       d    SmT R                  R
                  m O0 $ UU 4S jn[        U" 5       5      $ )zcget objects defined in enclosing code that are referred to by func

returns a dict of {name:object}r2   c               3      >#    [        TT5       H!  u  p UR                  nXR                  4v   M#     g ! [         a     M3  f = f7fr1   )zipcell_contents
ValueError)r)   crZ   closuresr<   s      r*   get_cell_contents#freevars.<locals>.get_cell_contents   sI     4*GD ! '' +  s%   A6A
A AAA)r   r7   r   __closure__rK   co_freevarsdict)r<   r^   r]   s   ` @r*   r   r   u   s[     ~~dmmt$##)r}}((	( !#$$r+   c                    [        U 5      n U c
  [        5       $ SSKnSSKJn  UR
                  S:  n[        5       nU" S5       n [        R                  " U 5        SSS5        WR                  5       R                  5        H|  nSU;   d  M  UR                  S5      S	   R                  S
5      S   nU(       a3  UR                  UR                  SS5      R                  SS5      5        Mk  UR                  U5        M~     [        U S[        5       5       H@  n	U	(       d  M  U(       d  M  [!        U	5      (       d  M'  UR#                  [%        U	SS95        MB     [        U5      $ ! [         a     GNf = f! , (       d  f       GN"= f)z.get the names of any globals found within funcNr   r   )capturei stdout_GLOBAL()zNULL + r/   z + NULLrE   TrB   )r   rG   systemprd   
hexversionrD   dis
IndexErrorgetvalue
splitlinessplitrF   replacerS   tupler   updater   )
r<   rC   rj   rd   CAN_NULLnamesoutliner)   rI   s
             r*   r   r      s+   :D|DF]~~*HEE		c	GGDM 

 ))+::c?2&,,S1!4D		$,,y"5==iLM		$ , dK12''fRjjLLr489 2 ;  		 
	s*   E7E&&
E40E73E44E77
Fc                 6    [        XU5      R                  5       $ )z@get the names of objects in the global scope referred to by func)r   r$   )r<   rC   builtins      r*   r   r      s    dW-2244r+   c                   ^	 [        U 5      (       a  U R                  n [        U 5      (       Ga[  U(       a&  [        [	        [
        5      5      R                  5       O0 m	U [        5       pUR                  =(       d    0  HG  n UR                  n[        XQU5      =(       d    0 nU R                  U5        T	R                  U5        MI     T	R                  UR                  =(       d    0 5        U(       d'  U R                  UR                  R                  5        GO/U R                  [!        UR                  5      5        U R                  5        H6  nT	R#                  U5      nXL a  M  U R                  [        USU5      5        M8     O[%        U 5      (       a  U(       a&  [        [	        [
        5      5      R                  5       O0 m	U(       d  U R                  n OmU R&                  n[        [!        U 5      5      n U R                  5        H6  nXsL a  M	  T	R#                  U5      nU R                  [        USU5      5        M8     O0 $ [)        U	4S jU  5       5      $ ! [         a     GM  f = f)z`get objects defined in global scope that are referred to by func

return a dict of {name:object}Tc              3   @   >#    U  H  oT;   d  M
  UTU   4v   M     g 7fr1   r2   )r3   r)   globss     r*   r5   globalvars.<locals>.<genexpr>   s!     Ettu}"eDk"ts   	)r   r7   r   r#   r   sumcopyrD   r`   rZ   r   rt   r[   r8   rK   co_namesr   getr   co_namerb   )
r<   rC   rz   	orig_funcr4   rZ   _varskeynested_funcr}   s
            @r*   r   r      s    ~~dmmt$/6Ys^$))+B4((.B.C$ # 1 1 #=7CIrE"U# / 	Y**0b1KK	**334KKi&8&89:yy{#iin+J{D'BC # 
/6Ys^$))+B==DI}T*+Dyy{##iinJ{D'BC # 	EtEEEM  s   I
I.-I.c                 j    [        U 5      n [        U 5      (       d  gU R                  U R                  4$ )zpget names of variables defined by func

returns a tuple (local vars, local vars referrenced by nested functions)r2   )r   r   co_varnamesco_cellvarsrN   s    r*   r   r      s0     :D$<<T----r+   c                 h   [        U S5      (       d#  [        U SX5      4 Vs/ s H	  o3c  M  UPM     sn$ [        U SS5      (       a  U R                  5       OU n / nU  Vs/ s H&  oUU;  d  M
  UR	                  [        USX5      5      PM(       nU Vs/ s H	  o3c  M  UPM     sn$ s  snf s  snf s  snf )z'get items in object that fail to pickle__iter__r   Nvalues)rT   r   rS   r   append)r4   exactsafej_objis         r*   r   r      s    3z""&s1U8:L:a:LL!#ht44#**,#CD69Kcd],T[[Aa+,cK-t!At--	 M L-s"   B%B%	B*, B*B/B/c                    ^ ^^^^ SSK Jm  T(       d  T" T TT5      (       a  gT $ [        UUU UU4S j[        T 5       5       5      $ )zget objects that fail to pickler   picklesNc              3      >#    U  H=  nT" [        TU5      TT5      (       a  M  U[        [        TU5      TS -
  TT5      4v   M?     g7fr   N)rS   r   r3   attrdepthr   r4   r   r   s     r*   r5   badobjects.<locals>.<genexpr>   sI      Ntwws4/@t'L J$
73t#4U1WU4HI
   A$A)dillr   rb   dirr4   r   r   r   r   s   ````@r*   r   r      sG    3uT""4
 N N3xN O Or+   c                    ^ ^^^^ SSK Jm  T(       d  T" T TT5      (       a  g[        T 5      $ [        UUU UU4S j[	        T 5       5       5      $ )z)get types for objects that fail to pickler   r   Nc              3      >#    U  H=  nT" [        TU5      TT5      (       a  M  U[        [        TU5      TS -
  TT5      4v   M?     g7fr   )rS   r   r   s     r*   r5   badtypes.<locals>.<genexpr>   sI      Ntwws4/@t'L H$T!2575FGr   )r   r   typerb   r   r   s   ````@r*   r   r      sL    3uT""4Cy N N3xN O Or+   c                    SSK JnJn  U(       d^   U" U 5      nU(       a  X`:X  d   SU< SU < 35       e[        U5      [        U 5      :X  d!   S[        U5      < S[        U 5      < 35       eg0 n[        U 5       H0  n	 [        X	5      n
U" XU5      (       a  M  [        XS-
  X#5      X'   M2     U$ ! [         a    SSKnUR                  5       S   s $ f = f! [         a    SSKnUR                  5       S   X'    M  f = f)z*get errors for objects that fail to pickler   )r   r   zUnpickling produces z instead of Nr   )
r   r   r   r   r:   rj   exc_infor   rS   r   )r4   r   r   r   r   r   pikrj   _dictr   _attrs              r*   r   r     s    "
	%s)Cz G>A#FGz9S	) O:>s)DINO) EC	C%E
 u4(( Qwu:EK  L  	%<<>!$$	%  	,,.+EK	s$   AB1 ?C1!CC#C?>C?)NF)T)TF)FF)r   FF)__doc__rm   r    r   r   r   r   r   pointersr	   r
   r   r   r   loggerr   __all__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r+   r*   <module>r      sp     F F > > B?8
>%,252Fj..OOr+   