
    $ShN                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddlT ddl	m
Z
mZmZmZmZmZmZ ddlmZ e
rddlmZ g ej        ZdZd	Zd
ed<    ed          Z ed          Z ede          Zed	d	dd	dej        ddddId            Zed	d	dd	dej        ddddJd"            Zed	d	dd	dej        ddddKd$            Zej        ej        d	d	dd	dej        ddd%
dLd&Zed	d	d	d'd'd'd	d'd'd'd(
dMd3            Zed	d	d	d'd'd'd	d'd'd'd(
dNd5            Z eef6          	 dOd	d	d	d'd'd'd	d'd'd'd(
dPd9            Z G d: d;ee                   Z d<dd	d	d	d'd'd'd	d'd'd'dej        d=dQdHZ!dS )Ra  PyTree integration with :mod:`dataclasses`.

This module implements PyTree integration with :mod:`dataclasses` by redefining the :func:`field`,
:func:`dataclass`, and :func:`make_dataclass` functions. Other APIs are re-exported from the
original :mod:`dataclasses` module.

The PyTree integration allows dataclasses to be flattened and unflattened recursively. The fields
are stored in a special attribute named ``__optree_dataclass_fields__`` in the dataclass.

>>> import math
... import optree
...
>>> @optree.dataclasses.dataclass(namespace='my_module')
... class Point:
...     x: float
...     y: float
...     z: float = 0.0
...     norm: float = optree.dataclasses.field(init=False, pytree_node=False)
...
...     def __post_init__(self) -> None:
...         self.norm = math.hypot(self.x, self.y, self.z)
...
>>> point = Point(2.0, 6.0, 3.0)
>>> point
Point(x=2.0, y=6.0, z=3.0, norm=7.0)
>>> # Flatten without specifying the namespace
>>> optree.tree_flatten(point)  # `Point`s are leaf nodes
([Point(x=2.0, y=6.0, z=3.0, norm=7.0)], PyTreeSpec(*))
>>> # Flatten with the namespace
>>> accessors, leaves, treespec = optree.tree_flatten_with_accessor(point, namespace='my_module')
>>> accessors, leaves, treespec  # doctest: +IGNORE_WHITESPACE,ELLIPSIS
(
    [
        PyTreeAccessor(*.x, (DataclassEntry(field='x', type=<class '...Point'>),)),
        PyTreeAccessor(*.y, (DataclassEntry(field='y', type=<class '...Point'>),)),
        PyTreeAccessor(*.z, (DataclassEntry(field='z', type=<class '...Point'>),))
    ],
    [2.0, 6.0, 3.0],
    PyTreeSpec(CustomTreeNode(Point[()], [*, *, *]), namespace='my_module')
)
>>> point == optree.tree_unflatten(treespec, leaves)
True
    )annotationsN)*)TYPE_CHECKINGAnyCallableLiteralProtocolTypeVaroverload)dataclass_transform)Iterable__optree_dataclass_fields__Tbool_PYTREE_NODE_DEFAULT_T_U_TypeT)boundinitreprhashcomparemetadatakw_onlydocpytree_nodedefaultr   r   r   bool | Noner   r   dict[Any, Any] | Noner   #bool | Literal[dataclasses.MISSING]r   
str | Noner   returnc        	            d S N )	r   r   r   r   r   r   r   r   r   s	            X/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/optree/dataclasses.pyfieldr(   \   	     
    default_factoryCallable[[], _T]c        	            d S r%   r&   )	r+   r   r   r   r   r   r   r   r   s	            r'   r(   r(   k   r)   r*   r   c                    d S r%   r&   r   s           r'   r(   r(   z   s	     #r*   )
r   r+   r   r   r   r   r   r   r   r   c        
           |pi                                  }|	|                    dt                    }	|	|d<   | ||||||d}
t          j        dk    r||
d<   n|t
          j        urt          d          t          j        dk    r||
d<   n|t          d	          |s|	rt          d
t           d          t          j	        di |
S )a*  Field factory for :func:`dataclass`.

    This factory function is used to define the fields in a dataclass. It is similar to the field
    factory :func:`dataclasses.field`, but with an additional ``pytree_node`` parameter. If
    ``pytree_node`` is :data:`True` (default), the field will be considered a child node in the
    PyTree structure which can be recursively flattened and unflattened. Otherwise, the field will
    be considered as PyTree metadata.

    Setting ``pytree_node`` in the field factory is equivalent to setting a key ``'pytree_node'`` in
    ``metadata`` in the original field factory. The ``pytree_node`` value can be accessed using
    ``field.metadata['pytree_node']``. If ``pytree_node`` is :data:`None`, the value
    ``metadata.get('pytree_node', True)`` will be used.

    .. note::
        If a field is considered a child node, it must be included in the argument list of the
        :meth:`__init__` method, i.e., passes ``init=True`` in the field factory.

    Args:
        pytree_node (bool or None, optional): Whether the field is a PyTree node.
        **kwargs (optional): Optional keyword arguments passed to :func:`dataclasses.field`.

    Returns:
        dataclasses.Field: The field defined using the provided arguments with
        ``field.metadata['pytree_node']`` set.
    Nr   )r   r+   r   r   r   r   r      
   r   z4field() got an unexpected keyword argument 'kw_only'r1      r   z0field() got an unexpected keyword argument 'doc'zN`pytree_node=True` is not allowed for non-init fields. Please explicitly set `'.field(init=False, pytree_node=False)`.r&   )
copygetr   sysversion_infodataclassesMISSING	TypeError__name__r(   )r   r+   r   r   r   r   r   r   r   r   kwargss              r'   r(   r(      s   L B$$&&Hll=2FGG)H] * F 7""#y	+	+	+NOOO
7""u	JKKK 
K 
X&.X X X
 
 	

 &&v&&&r*   F
r   r   eqorderunsafe_hashfrozen
match_argsr   slotsweakref_slotr@   rA   rB   rC   rD   rE   rF   	namespacestrCallable[[_TypeT], _TypeT]c                    d S r%   r&   )r   r   r@   rA   rB   rC   rD   r   rE   rF   rG   s              r'   	dataclassrK      s	     "%r*   clsc                  d S r%   r&   )rL   r   r   r@   rA   rB   rC   rD   r   rE   rF   rG   s               r'   rK   rK      s	      Sr*   )field_specifiers_TypeT | None#_TypeT | Callable[[_TypeT], _TypeT]c              x    ddl m} ||||||dt          j        dk    r|d<   |d<   |	d<   n9|durt	          d	          |d
urt	          d          |	d
urt	          d          t          j        dk    r|
d<   n|
d
urt	          d           	d,fd}|S t          j                   st	          dt           d d          t           j	        v r t	          dt           d j         d          |ur(t          t                    st	          dd          dk    r|t          j         fi  i }i t          j                   D ]e}|j                            dt"                    r2|j        s t	          d|j        dt           d          |||j        <   T|j        r
||j        <   ft)          |          t+          j        |          }t+          j                  t/           t          |f           d-fd#}d. fd(}dd)lm} dd*l m}  | |||+          S )/a  Dataclass decorator with PyTree integration.

    Args:
        cls (type or None, optional): The class to decorate. If :data:`None`, return a decorator.
        namespace (str): The registry namespace used for the PyTree registration.
        **kwargs (optional): Optional keyword arguments passed to :func:`dataclasses.dataclass`.

    Returns:
        type or callable: The decorated class with PyTree integration or decorator function.
    r   __GLOBAL_NAMESPACEr   r   r@   rA   rB   rC   r0   rD   r   rE   Tz;dataclass() got an unexpected keyword argument 'match_args'Fz8dataclass() got an unexpected keyword argument 'kw_only'z6dataclass() got an unexpected keyword argument 'slots'r1      rF   z=dataclass() got an unexpected keyword argument 'weakref_slot'NrL   r   r#   c                "    t          | fdiS )NrG   )rK   )rL   r>   rG   s    r'   	decoratorzdataclass.<locals>.decorator-  s    S@@I@@@@r*   @z0.dataclass() can only be used with classes, not .z".dataclass() cannot be applied to z more than once.$The namespace must be a string, got  r   zPyTree node field z> must be included in `__init__()`. Or you can explicitly set `r5   objr   Ctuple[tuple[_U, ...], tuple[tuple[str, Any], ...], tuple[str, ...]]c               |     t           fdD                       }t           fdD                       }||fS )Nc              3  8   K   | ]}t          |          V  d S r%   getattr.0namer]   s     r'   	<genexpr>z2dataclass.<locals>.flatten_func.<locals>.<genexpr>Y  s-      MMd++MMMMMMr*   c              3  <   K   | ]}|t          |          fV  d S r%   ra   rc   s     r'   rf   z2dataclass.<locals>.flatten_func.<locals>.<genexpr>Z  s2      PP$T 2 23PPPPPPr*   )tuple)r]   childrenr   children_field_namesmetadata_fieldss   `  r'   flatten_funczdataclass.<locals>.flatten_funcQ  sY     MMMM8LMMMMMPPPPPPPPP#777r*   r   tuple[tuple[str, Any], ...]ri   tuple[_U, ...]c               x    t          t          |                    }|                    |             di |S )Nr&   )dictzipupdate)r   ri   r>   rj   rL   s      r'   unflatten_funcz!dataclass.<locals>.unflatten_func^  s?    c.99::hs}}V}}r*   )DataclassEntry)register_pytree_node)path_entry_typerG   )rL   r   r#   r   )r]   r   r#   r^   )r   rm   ri   rn   r#   r   )optree.registryrS   r8   r9   r<   inspectisclassr=   _FIELDS__dict__
isinstancerH   r:   rK   fieldsr   r7   r   r   re   rh   typesMappingProxyTypesetattroptree.accessorsrt   ru   )rL   r   r   r@   rA   rB   rC   rD   r   rE   rF   rG   GLOBAL_NAMESPACErX   children_fieldsfrl   rs   rt   ru   rj   r>   rk   s   `          `        @@@r'   rK   rK      su   8 GFFFFF " F 7"")|#yw	4		UVVV			RSSS	e		PQQQ
7""!-~	U	"	"WXXX
{	A 	A 	A 	A 	A 	A 	A ?3 `^H^^VY^^^___#,ZZZCLZZZ
 
 	
 (((Is1K1K(MyMMMNNNB$	


.
.v
.
.COO$$ 	( 	(:>>-)=>> 	(6 d d d2:d d d   '(OAF##V 	(&'OAF# 11,_==O,_==OC?O<===
8 
8 
8 
8 
8 
8 
8      
 0/////444444&   r*   c                  .    e Zd Zddddddddddd
ddZdS )_DataclassDecoratorTFr?   rL   r   r   r   r   r@   rA   rB   rC   rD   r   rE   rF   r#   c      
            t           r%   )NotImplementedError)selfrL   r   r   r@   rA   rB   rC   rD   r   rE   rF   s               r'   __call__z_DataclassDecorator.__call__p  s
      "!r*   N)rL   r   r   r   r   r   r@   r   rA   r   rB   r   rC   r   rD   r   r   r   rE   r   rF   r   r#   r   )r=   
__module____qualname__r   r&   r*   r'   r   r   o  sR         !"" " " " " " " "r*   r   r&   )basesnsr   r   r@   rA   rB   rC   rD   r   rE   rF   modulerX   cls_namer}   6Iterable[str | tuple[str, Any] | tuple[str, Any, Any]]r   tuple[type, ...]r   dict[str, Any] | Noner   rX   _DataclassDecorator[_TypeT]c                  ddl m} t          |t                    s|/||u st          |t                    r||}}n|t          d          ||ur(t          |t                    st          d|d          |dk    r|}||||||	d}||d	}t          j        d
k    r|
|d<   ||d<   ||d<   n9|
durt          d          |durt          d          |durt          d          t          j        dk    r||d<   n|durt          d          t          j        dk    r|	 t          j        d          pd}nt# t          $ rg t          j        t          t                    5  t          j        d          j                            dd          }ddd           n# 1 swxY w Y   Y nw xY w||d<   n|t          d          d}t          j        dk    r8|t           j        t"          fv rt%          j        t"          |          }d}||d<   n|t           j        urt          d          t!          j        | fd |i||}|s=|                    dd           |                    dd           t#          |fi |d!|i}|S )"a  Make a new dynamically created dataclass with PyTree integration.

    The dataclass name will be ``cls_name``. ``fields`` is an iterable of either (name), (name, type),
    or (name, type, Field) objects. If type is omitted, use the string :data:`typing.Any`. Field
    objects are created by the equivalent of calling :func:`field` (name, type [, Field-info]).

    The ``namespace`` parameter is the PyTree registration namespace which should be a string. The
    ``namespace`` in the original :func:`dataclasses.make_dataclass` function is renamed to ``ns``
    to avoid conflicts.

    The remaining parameters are passed to :func:`dataclasses.make_dataclass`.
    See :func:`dataclasses.make_dataclass` for more information.

    Args:
        cls_name: The name of the dataclass.
        fields (Iterable[str | tuple[str, Any] | tuple[str, Any, Any]]): An iterable of either
            (name), (name, type), or (name, type, Field) objects.
        namespace (str): The registry namespace used for the PyTree registration.
        ns (dict or None, optional): The namespace used in dynamic type creation.
            See :func:`dataclasses.make_dataclass` and the builtin :func:`type` function for more
            information.
        **kwargs (optional): Optional keyword arguments passed to :func:`dataclasses.make_dataclass`.

    Returns:
        type: The dynamically created dataclass with PyTree integration.
    r   rR   Nz?make_dataclass() missing 1 required keyword-only argument: 'ns'r[   rZ   r\   rT   )r   rG   r0   rD   r   rE   Tz@make_dataclass() got an unexpected keyword argument 'match_args'Fz=make_dataclass() got an unexpected keyword argument 'kw_only'z;make_dataclass() got an unexpected keyword argument 'slots'rU   rF   zBmake_dataclass() got an unexpected keyword argument 'weakref_slot')r1         __main__r=   r   z<make_dataclass() got an unexpected keyword argument 'module'r3   )rG   rX   z?make_dataclass() got an unexpected keyword argument 'decorator'r}   rG   )rw   rS   r|   rp   rH   r<   r8   r9   _getframemodulenameAttributeError
contextlibsuppress
ValueError	_getframe	f_globalsr7   r:   rK   	functoolspartialmake_dataclasspop)r   r}   r   r   r   r   r@   rA   rB   rC   rD   r   rE   rF   r   rX   rG   r   dataclass_kwargsmake_dataclass_kwargsregistered_by_decoratorrL   s                         r'   r   r     s   ` GFFFFF)T"" _i&7!!!ZC%8%8!%r	BBZ]^^^(((Is1K1K(MyMMMNNNB$	 "   
 7"")3&&-#$)!!	4		Z[[[			WXXX	e		UVVV
7""+7((	U	"	"\]]]
7"">T033Az! T T T(DD T T ]1--7;;J
SSFT T T T T T T T T T T T T T TT +1h''		VWWW#
7"".	:::!))yIIII&*#-6k**	+/	/	/YZZZ,    	 C # FWd+++^T222EE/EE9EEEJs6   $D; ;)F,$.FF,F"	"F,%F"	&F,+F,)r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r   r   r#   r   )r+   r,   r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r   r   r#   r   )r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r   r   r#   r   )r   r   r+   r   r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r   r   r#   r   )r   r   r   r   r@   r   rA   r   rB   r   rC   r   rD   r   r   r   rE   r   rF   r   rG   rH   r#   rI   )rL   r   r   r   r   r   r@   r   rA   r   rB   r   rC   r   rD   r   r   r   rE   r   rF   r   rG   rH   r#   r   r%   )rL   rO   r   r   r   r   r@   r   rA   r   rB   r   rC   r   rD   r   r   r   rE   r   rF   r   rG   rH   r#   rP   )$r   rH   r}   r   r   r   r   r   r   r   r   r   r@   r   rA   r   rB   r   rC   r   rD   r   r   r   rE   r   rF   r   r   r"   rX   r   rG   rH   r#   r   )"__doc__
__future__r   r   r:   r   rx   r8   r~   typingr   r   r   r   r	   r
   r   typing_extensionsr   collections.abcr   __all__rz   r   __annotations__r   r   typer   r;   r(   rK   r   r   r&   r*   r'   <module>r      s  * * *\ # " " " " "              



      U U U U U U U U U U U U U U U U U U 1 1 1 1 1 1  )((((((
 !K
  (!  ! ! ! ! WT]]WT]]		&	&	& 
 &*3>3F#     
 
 &*3>3F#     
 
 &*3>3F#
 
 
 
 
 

 &&.&*3>3F#E' E' E' E' E' E'P 
 % % % % % 
%  

      
$ uh///w w w w w w 0/wt" " " " "(6* " " "4 ! $-8-B%y y y y y y y yr*   