o
    u#g3                     @   s   d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZmZmZ G dd dZdd Zd	d
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dZdS ) a+  
Helper functions for managing the Matplotlib API.

This documentation is only relevant for Matplotlib developers, not for users.

.. warning::

    This module and its submodules are for internal use only.  Do not use them
    in your own code.  We may change the API at any time with no warning.

    N   )	
deprecatedwarn_deprecatedrename_parameterdelete_parametermake_keyword_onlydeprecate_method_overridedeprecate_privatize_attribute'suppress_matplotlib_deprecation_warningMatplotlibDeprecationWarningc                   @   s.   e Zd ZdZd	ddZdd Zedd ZdS )
classpropertya$  
    Like `property`, but also triggers on access via the class, and it is the
    *class* that's passed as argument.

    Examples
    --------
    ::

        class C:
            @classproperty
            def foo(cls):
                return cls.__name__

        assert C.foo == "C"
    Nc                 C   s4   || _ |d us|d urtd|| _|| _|| _d S )Nz#classproperty only implements fget.)_fget
ValueErrorfsetfdel_doc)selffgetr   r   doc r   }/var/www/static.ux5.de/https/Moving-Object-Detection-with-OpenCV/env/lib/python3.10/site-packages/matplotlib/_api/__init__.py__init__,   s   
zclassproperty.__init__c                 C   s
   |  |S Nr   )r   instanceownerr   r   r   __get__5   s   
zclassproperty.__get__c                 C   s   | j S r   r   )r   r   r   r   r   8   s   zclassproperty.fget)NNN)__name__
__module____qualname____doc__r   r   propertyr   r   r   r   r   r      s    
	r   c             
      s   t d t| t r| fn| du r fn
t fdd| D }  fdd}| D ]B\}}t|| sjg t|| }d|v rF|d |d td|t	|dkr_d	
|dd
 d |d
  n|d |t |q(dS )a3  
    For each *key, value* pair in *kwargs*, check that *value* is an instance
    of one of *types*; if not, raise an appropriate TypeError.

    As a special case, a ``None`` entry in *types* is treated as NoneType.

    Examples
    --------
    >>> _api.check_isinstance((SomeClass, None), arg=arg)
    Nc                 3   s     | ]}|d u r
 n|V  qd S r   r   ).0tp	none_typer   r   	<genexpr>N   s    z#check_isinstance.<locals>.<genexpr>c                    s.   |  u rdS | j dkr| jS | j  d| j S )NNonebuiltins.)r   r   )r#   r$   r   r   	type_nameP   s
   z#check_isinstance.<locals>.type_namer'   z({!r} must be an instance of {}, not a {}r   , z or r   )type
isinstancetupleitemsmapremoveappend	TypeErrorformatlenjoin)typeskwargsr*   kvnamesr   r$   r   check_isinstance@   s.   



r=   T)_print_supported_valuesc               K   s^   |st d| D ]"\}}|| vr,|d| }|r(|ddtt|  7 }t|q
dS )ak  
    For each *key, value* pair in *kwargs*, check that *value* is in *values*;
    if not, raise an appropriate ValueError.

    Parameters
    ----------
    values : iterable
        Sequence of values to check on.
    _print_supported_values : bool, default: True
        Whether to print *values* when raising ValueError.
    **kwargs : dict
        *key, value* pairs as keyword arguments to find in *values*.

    Raises
    ------
    ValueError
        If any *value* in *kwargs* is not found in *values*.

    Examples
    --------
    >>> _api.check_in_list(["foo", "bar"], arg=arg, other_arg=other_arg)
    zNo argument to check! is not a valid value for ; supported values are r+   N)r4   r0   r7   r1   reprr   )valuesr>   r9   keyvalmsgr   r   r   check_in_listc   s   rF   c             	      s   |  D ]\\}}|j}t|t| kstdd t|| D r`ttddd t D  d	 fdd| ddd	 D ddd	 }t| d
krN|d7 }t
|dt|  d| d|j qdS )a  
    For each *key, value* pair in *kwargs*, check that *value* has the shape *shape*;
    if not, raise an appropriate ValueError.

    *None* in the shape is treated as a "free" size that can have any length.
    e.g. (None, 2) -> (N, 2)

    The values checked must be numpy arrays.

    Examples
    --------
    To check for (N, 2) shaped arrays

    >>> _api.check_shape((None, 2), arg=arg, other_arg=other_arg)
    c                 s   s$    | ]\}}||ko|d uV  qd S r   r   )r"   str   r   r   r&      s   " zcheck_shape.<locals>.<genexpr>NMLKJIHc                 s   s    | ]}d | V  qdS )DNr   )r"   ir   r   r   r&      s    r+   c                    s$   g | ]}|d urt |nt qS r   )strnext)r"   n
dim_labelsr   r   
<listcomp>   s    zcheck_shape.<locals>.<listcomp>Nr,   r   ,z	 must be zD with shape (z), but your input has shape )r0   shaper6   anyzipiter	itertoolschaincountr7   r   )rS   r9   r:   r;   
data_shape
text_shaper   rO   r   check_shape   s.   r\   c                K   sb   t |dkr
td| \\}}z| | W S  ty0   t|d| ddtt|  dw )z
    *kwargs* must consist of a single *key, value* pair.  If *key* is in
    *mapping*, return ``mapping[value]``; else, raise an appropriate
    ValueError.

    Examples
    --------
    >>> _api.check_getitem({"foo": "bar"}, arg=arg)
    r   z-check_getitem takes a single keyword argumentr?   r@   r+   N)r6   r   r0   KeyErrorr7   r1   rA   )mappingr9   r:   r;   r   r   r   check_getitem   s   

r_   c                    sD    j dksJ dd t  D   tj fdd}|S )a
  
    Helper decorator for implementing module-level ``__getattr__`` as a class.

    This decorator must be used at the module toplevel as follows::

        @caching_module_getattr
        class __getattr__:  # The class *must* be named ``__getattr__``.
            @property  # Only properties are taken into account.
            def name(self): ...

    The ``__getattr__`` class will be replaced by a ``__getattr__``
    function such that trying to access ``name`` on the module will
    resolve the corresponding property (which may be decorated e.g. with
    ``_api.deprecated`` for deprecating module globals).  The properties are
    all implicitly cached.  Moreover, a suitable AttributeError is generated
    and raised if no property with the given name exists.
    __getattr__c                 S   s    i | ]\}}t |tr||qS r   )r.   r!   )r"   namepropr   r   r   
<dictcomp>   s    z*caching_module_getattr.<locals>.<dictcomp>c                    s,   | v r|   S td jd| )Nzmodule z has no attribute )r   AttributeErrorr   ra   clsr   propsr   r   r`      s
   z+caching_module_getattr.<locals>.__getattr__)r   varsr0   	functoolscache)rg   r`   r   rf   r   caching_module_getattr   s   rl   c                    s    du r
t t| S  fdd}|  D ]?\}}d}dD ]-}|| t v rId}|D ]}||| }|| |_d||  d|_t || | q*q|sStd	|qd
d }	t	 di }
|	|
|	| @ }|rot
d| i |
|  _ S )aT  
    Class decorator for defining property aliases.

    Use as ::

        @_api.define_aliases({"property": ["alias", ...], ...})
        class C: ...

    For each property, if the corresponding ``get_property`` is defined in the
    class so far, an alias named ``get_alias`` will be defined; the same will
    be done for setters.  If neither the getter nor the setter exists, an
    exception will be raised.

    The alias map is stored as the ``_alias_map`` attribute on the class and
    can be used by `.normalize_kwargs` (which assumes that higher priority
    aliases come last).
    Nc                    s    t t  fdd}|S )Nc                    s   t |  |i |S r   )getattr)r   argsr9   re   r   r   method   s   z2define_aliases.<locals>.make_alias.<locals>.method)rj   wrapsrm   )ra   ro   rg   re   r   
make_alias   s   z"define_aliases.<locals>.make_aliasF)get_set_TzAlias for `z`.z%Neither getter nor setter exists for c                 S   s   h | dd |   D S )Nc                 s   s    | ]
}|D ]}|V  qqd S r   r   )r"   aliasesaliasr   r   r   r&   	  s    zBdefine_aliases.<locals>.get_aliased_and_aliases.<locals>.<genexpr>)rB   )dr   r   r   get_aliased_and_aliases  s   z/define_aliases.<locals>.get_aliased_and_aliases
_alias_mapz2Parent class already defines conflicting aliases: )rj   partialdefine_aliasesr0   ri   r   r    setattrr   rm   NotImplementedErrorry   )alias_drg   rr   rb   ru   existsprefixrv   ro   rx   preexisting_aliasesconflictingr   rq   r   r{      s<   
r{   c              	   O   sN   t | D ] \}}z
||i |W   S  ty$   |t| d kr" Y qw dS )a  
    Select and call the function that accepts ``*args, **kwargs``.

    *funcs* is a list of functions which should not raise any exception (other
    than `TypeError` if the arguments passed do not match their signature).

    `select_matching_signature` tries to call each of the functions in *funcs*
    with ``*args, **kwargs`` (in the order in which they are given).  Calls
    that fail with a `TypeError` are silently skipped.  As soon as a call
    succeeds, `select_matching_signature` returns its return value.  If no
    function accepts ``*args, **kwargs``, then the `TypeError` raised by the
    last failing call is re-raised.

    Callers should normally make sure that any ``*args, **kwargs`` can only
    bind a single *func* (to avoid any ambiguity), although this is not checked
    by `select_matching_signature`.

    Notes
    -----
    `select_matching_signature` is intended to help implementing
    signature-overloaded functions.  In general, such functions should be
    avoided, except for back-compatibility concerns.  A typical use pattern is
    ::

        def my_func(*args, **kwargs):
            params = select_matching_signature(
                [lambda old1, old2: locals(), lambda new: locals()],
                *args, **kwargs)
            if "old1" in params:
                warn_deprecated(...)
                old1, old2 = params.values()  # note that locals() is ordered.
            else:
                new, = params.values()
            # do things with params

    which allows *my_func* to be called either with two parameters (*old1* and
    *old2*) or a single one (*new*).  Note that the new signature is given
    last, so that callers get a `TypeError` corresponding to the new signature
    if the arguments they passed in do not match any signature.
    r   N)	enumerater4   r6   )funcsrn   r9   rK   funcr   r   r   select_matching_signature  s   ,r   c                 C   s   t |  d| d| dS )zEGenerate a TypeError to be raised by function calls with wrong arity.z	() takes z positional arguments but z were given)r4   )ra   takesgivenr   r   r   nargs_errorJ  s   
r   c                 C   s*   t |tstt|}t|  d| dS )aL  
    Generate a TypeError to be raised by function calls with wrong kwarg.

    Parameters
    ----------
    name : str
        The name of the calling function.
    kw : str or Iterable[str]
        Either the invalid keyword argument name, or an iterable yielding
        invalid keyword arguments (e.g., a ``kwargs`` dict).
    z'() got an unexpected keyword argument '')r.   rL   rM   rV   r4   )ra   kwr   r   r   kwarg_errorP  s   
r   c                 c   s(    | V  |   D ]	}t|E dH  qdS )z8Yield *cls* and direct and indirect subclasses of *cls*.N)__subclasses__recursive_subclasses)rg   subclsr   r   r   r   a  s
   r   c                 C   sX   t  }tdD ]}|du r ntd|jdds n|j}q	~t	
| || dS )a4  
    `warnings.warn` wrapper that sets *stacklevel* to "outside Matplotlib".

    The original emitter of the warning can be obtained by patching this
    function back to `warnings.warn`, i.e. ``_api.warn_external =
    warnings.warn`` (or ``functools.partial(warnings.warn, stacklevel=2)``,
    etc.).
    r   Nz-\A(matplotlib|mpl_toolkits)(\Z|\.(?!tests\.))r    )sys	_getframerW   rY   rematch	f_globalsgetf_backwarningswarn)messagecategoryframe
stacklevelr   r   r   warn_externalh  s   	r   r   )r    rj   rW   r   r   r   deprecationr   r   r   r   r   r   r	   r
   r   r   r=   rF   r\   r_   rl   r{   r   r   r   r   r   r   r   r   r   <module>   s&    ,%#!#
#74