
    >ie                        d dl mZ d dlmZ d dlmZ d dlmZ ddgZ G d d          Z	d Z
edd
            Zd Z G d d          Zd	S )    )annotations)Callable)contextmanager)ClassVarCallbackadd_callbacksc                  p    e Zd ZU dZ e            Zded<   	 ddZedd            Z	d	 Z
d
 ZddZddZdS )r   a  Base class for using the callback mechanism

    Create a callback with functions of the following signatures:

    >>> def start(dsk):
    ...     pass
    >>> def start_state(dsk, state):
    ...     pass
    >>> def pretask(key, dsk, state):
    ...     pass
    >>> def posttask(key, result, dsk, state, worker_id):
    ...     pass
    >>> def finish(dsk, state, failed):
    ...     pass

    You may then construct a callback object with any number of them

    >>> cb = Callback(pretask=pretask, finish=finish)

    And use it either as a context manager over a compute/get call

    >>> with cb:            # doctest: +SKIP
    ...     x.compute()

    Or globally with the ``register`` method

    >>> cb.register()
    >>> cb.unregister()

    Alternatively subclass the ``Callback`` class with your own methods.

    >>> class PrintKeys(Callback):
    ...     def _pretask(self, key, dask, state):
    ...         print("Computing: {0}!".format(repr(key)))

    >>> with PrintKeys():   # doctest: +SKIP
    ...     x.compute()
    z*ClassVar[set[tuple[Callable | None, ...]]]activeNc                d    |r|| _         |r|| _        |r|| _        |r|| _        |r	|| _        d S d S N_start_start_state_pretask	_posttask_finish)selfstartstart_statepretaskposttaskfinishs         .lib/python3.11/site-packages/dask/callbacks.py__init__zCallback.__init__4   s^      	 DK 	, +D 	$#DM 	&%DN 	"!DLLL	" 	"    returntuple[Callable | None, ...]c                B     g d}t           fd|D                       S )Nr   c              3  :   K   | ]}t          |d           V  d S r   )getattr).0ir   s     r   	<genexpr>z%Callback._callback.<locals>.<genexpr>E   s/      <<WT1d++<<<<<<r   )tuple)r   fieldss   ` r   	_callbackzCallback._callbackB   s1    OOO<<<<V<<<<<<r   c                `    t          |           | _        | j                                         | S r   )r   _cm	__enter__r   s    r   r)   zCallback.__enter__G   s*     &&r   c                $     | j         j        |  d S r   )r(   __exit__)r   argss     r   r,   zCallback.__exit__L   s    4    r   Nonec                N    t           j                            | j                   d S r   )r   r
   addr&   r*   s    r   registerzCallback.registerO   s     DN+++++r   c                N    t           j                            | j                   d S r   )r   r
   remover&   r*   s    r   
unregisterzCallback.unregisterR   s     t~.....r   )NNNNN)r   r   )r   r.   )__name__
__module____qualname____doc__setr
   __annotations__r   propertyr&   r)   r,   r1   r4    r   r   r   r   
   s         % %N :=F>>>> QU" " " " = = = X=  
! ! !, , , ,/ / / / / /r   c                4    | rd t          |  D             S g dS )z>Take an iterable of callbacks, return a list of each callback.c                &    g | ]}d  |D             S )c                    g | ]}||S r<   r<   )r!   r"   s     r   
<listcomp>z/unpack_callbacks.<locals>.<listcomp>.<listcomp>Y   s    ###q####r   r<   )r!   fs     r   r@   z$unpack_callbacks.<locals>.<listcomp>Y   s'    777##A###777r   )r<   r<   r<   r<   r<   )zip)cbss    r   unpack_callbacksrD   V   s.    
 $77S#Y7777####r   Nc              #     K   | du }|r%t           j        t                      c} t           _        	 | pdV  |r| t           _        dS dS # |r| t           _        w xY w)zAllows callbacks to work with nested schedulers.

    Callbacks will only be used by the first started scheduler they encounter.
    This means that only the outermost scheduler will use global callbacks.Nr<   )r   r
   r9   )	callbacksglobal_callbackss     r   local_callbacksrH   ^   s}       !D( <%-_cee"	8?(o2 	('HOOO	( 	( 	('HO''''s   A Ac                    t          | t                    r| j        S t          | t                    r| S t	          d          )z Normalizes a callback to a tuplez.Callbacks must be either `Callback` or `tuple`)
isinstancer   r&   r$   	TypeError)cbs    r   normalize_callbackrM   n   sD    "h J|	B		 J	HIIIr   c                  $    e Zd ZdZd Zd Zd ZdS )r   a  Context manager for callbacks.

    Takes several callbacks and applies them only in the enclosed context.
    Callbacks can either be represented as a ``Callback`` object, or as a tuple
    of length 4.

    Examples
    --------
    >>> def pretask(key, dsk, state):
    ...     print("Now running {0}").format(key)
    >>> callbacks = (None, pretask, None, None)
    >>> with add_callbacks(callbacks):    # doctest: +SKIP
    ...     res.compute()
    c                p    d |D             | _         t          j                            | j                    d S )Nc                ,    g | ]}t          |          S r<   )rM   )r!   cs     r   r@   z*add_callbacks.__init__.<locals>.<listcomp>   s!    CCCA,Q//CCCr   )rF   r   r
   update)r   rF   s     r   r   zadd_callbacks.__init__   s5    CCCCCt~.....r   c                    d S r   r<   r*   s    r   r)   zadd_callbacks.__enter__   s    r   c                X    | j         D ]!}t          j                            |           "d S r   )rF   r   r
   discard)r   typevalue	tracebackrQ   s        r   r,   zadd_callbacks.__exit__   s6     	' 	'AO##A&&&&	' 	'r   N)r5   r6   r7   r8   r   r)   r,   r<   r   r   r   r   x   sK         / / /  ' ' ' ' 'r   r   )
__future__r   collections.abcr   
contextlibr   typingr   __all__r   rD   rH   rM   r   r<   r   r   <module>r^      s    " " " " " " $ $ $ $ $ $ % % % % % %      
'I/ I/ I/ I/ I/ I/ I/ I/X$ $ $ ( ( ( (J J J' ' ' ' ' ' ' ' ' 'r   