
    h5                         S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJ	r	J
r
JrJrJrJrJrJr   " S S5      rS rSS	.S
 jrS rS rS rSS jrS rS rS rS rSS jrg)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                   8    \ rS rSrSrSS jrS r\S 5       rSr	g)	classproperty   z
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                 V    Xl         Uc  Ub  [        S5      eX l        X0l        X@l        g )Nz#classproperty only implements fget.)_fget
ValueErrorfsetfdel_doc)selffgetr   r   docs        J/var/www/html/env/lib/python3.13/site-packages/matplotlib/_api/__init__.py__init__classproperty.__init__-   s-    
t/BCC			    c                 $    U R                  U5      $ Nr   )r   instanceowners      r   __get__classproperty.__get__6   s    zz%  r   c                     U R                   $ r   r   )r   s    r   r   classproperty.fget9   s    zzr   )r   r   r   r   )NNN)
__name__
__module____qualname____firstlineno____doc__r   r"   propertyr   __static_attributes__ r   r   r   r      s%     !  r   r   c                  ^ [        S5      m[        U [         5      (       a  U 4OU c  T4O[        U4S jU  5       5      n U4S jnUR                  5        H  u  p4[        X@5      (       a  M  / [	        X 5      QnSU;   a"  UR                  S5        UR                  S5        [        SR                  U[        U5      S:  a  SR                  USS 5      S	-   US   -   OUS
   U" [        U5      5      5      5      e   g)a  
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   0   >#    U  H  oc  TOUv   M     g 7fr   r-   ).0tp	none_types     r   	<genexpr>#check_isinstance.<locals>.<genexpr>O   s     CUr
92Us   c                    > U TL a  S$ U R                   S:X  a  U R                  $ U R                    SU R                   3$ )NNonebuiltins.)r'   r(   )r1   r2   s    r   	type_name#check_isinstance.<locals>.type_nameQ   sD    	/ 	;(*(CR__	;a'89	;r   r6   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kwargsr9   kvnamesr2   s         @r   check_isinstancerM   A   s     T
I#E400eX"]i\CUCC 
;
 !##,c)+,EV$V$:AA5zA~ IIeCRj)F2U2Y>+08d1g&	() ) r   T)_print_supported_valuesc         	          U(       d  [        S5      eUR                  5        HI  u  p4X@;  d  M  U< SU 3nU(       a%  USSR                  [        [        U 5      5       3-  n[        U5      e   g)a#  
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)rD   r@   rG   rA   reprr   )valuesrN   rI   keyvalmsgs         r   check_in_listrW   d   sl    . /00LLNG5cU;C&03tV;L1M0NOOS/! #r   c          
      D   UR                  5        GH  u  p#UR                  n[        U5      [        U 5      :w  d"  [        S [	        X@5       5       5      (       d  ML  [        [        R                  " SS [        R                  " 5        5       5      5      nSR                  U SSS2    Vs/ s H  nUb  [        U5      O
[        U5      PM     snSSS2   5      n[        U 5      S:X  a  US-  n[        U< S	[        U 5       S
U SUR                   35      e   gs  snf )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              3   D   #    U  H  u  pX:g  =(       a    US Lv   M     g 7fr   r-   )r0   sts      r   r3   check_shape.<locals>.<genexpr>   s"     S<RDAqv/!4-/<Rs    NMLKJIHc              3   ,   #    U  H
  nS U 3v   M     g7f)DNr-   )r0   is     r   r3   r\      s     4"3Q1QC"3s   r;   Nr<   r   ,z	 must be zD with shape (z), but your input has shape )r@   shaperF   anyzipiter	itertoolschaincountrG   strnextr   )rb   rI   rJ   rK   
data_shape
dim_labelsn
text_shapes           r   check_shapero      s     WW

Os5z)SC
<RSSSioo4)//"346 7J -24R4[$:-8 /0mCFjAQ$Q-8$::>B$$@ AJ5zQc!
%yUN:, G,,-GG96  $:s   ,#D
c                    [        U5      S:w  a  [        S5      eUR                  5       u  u  p# X   $ ! [         a3    [        U< SU SSR	                  [        [        U 5      5       35      Sef = f)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 argumentrP   rQ   r;   N)rF   r   r@   KeyErrorrG   rA   rR   )mappingrI   rJ   rK   s       r   check_getitemrs      s     6{aHIIllnGFQ:z :e-aS0GyyT7+,-/059	::s	   4 =A1c                 
  ^ ^^ T R                   S:X  d   e[        T 5      R                  5        VVs0 s H  u  p[        U[        5      (       d  M  X_M      snnmT " 5       m[
        R                  U UU4S j5       nU$ s  snnf )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                 r   > U T;   a  TU    R                  T5      $ [        STR                  < SU < 35      e)Nzmodule z has no attribute )r"   AttributeErrorr'   )nameclsr    propss    r   ru   +caching_module_getattr.<locals>.__getattr__   sD    5=;&&x00cnn''9$BD 	Dr   )r&   varsr@   r>   r+   	functoolscache)ry   rx   propru   r    rz   s   `   @@r   caching_module_getattrr      s{    & <<=(((*.s)//*; ,*;JD4* TZ*; ,EuH__D D ,s   A?A?c                   ^ Tc  [         R                  " [        U 5      $ U4S jnU R                  5        Hs  u  p4SnS HP  nXc-   [	        T5      ;   d  M  SnU H2  nU" Xc-   5      nXg-   Ul        SXc-    S3Ul        [        TXg-   U5        M4     MR     U(       a  Mf  [        SU< 35      e   S n	[        TS	0 5      n
U	" U
5      U	" U 5      -  nU(       a  [        S
U 35      e0 U
EU ETl        T$ )a$  
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).
c                 \   >^  [         R                  " [        TT 5      5      U 4S j5       nU$ )Nc                 (   > [        U T5      " U0 UD6$ r   )getattr)r   argsrI   rx   s      r   method2define_aliases.<locals>.make_alias.<locals>.method   s    4&777r   )r}   wrapsr   )rx   r   ry   s   ` r   
make_alias"define_aliases.<locals>.make_alias   s*    	d+	,	8 
-	8r   F)get_set_TzAlias for `z`.z%Neither getter nor setter exists for c                 8    1 U kS U R                  5        5       k$ )Nc              3   6   #    U  H  o  H  o"v   M     M     g 7fr   r-   )r0   aliasesaliass      r   r3   Bdefine_aliases.<locals>.get_aliased_and_aliases.<locals>.<genexpr>
  s     K:7%e7e:s   )rS   )ds    r   get_aliased_and_aliases/define_aliases.<locals>.get_aliased_and_aliases	  s    LLK188:KLLr   
_alias_mapz2Parent class already defines conflicting aliases: )r}   partialdefine_aliasesr@   r|   r&   r*   setattrr   r   NotImplementedErrorr   )alias_dry   r   r   r   existsprefixr   r   r   preexisting_aliasesconflictings    `          r   r   r      s   $ {  99 !&F}S	)$E'6F&,nFO'26=/%DFNC8	 % ' v7x@B B )M "#|R8*+>?,W56K!@NP 	P7+7w7CNJr   c                     [        U 5       H  u  p4 U" U0 UD6s  $    g! [         a    U[        U 5      S-
  :X  a  e  M3  f = f)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)	enumeraterD   rF   )funcsr   rI   r`   funcs        r   select_matching_signaturer     sT    X U#	((( $  	CJN" #	s   A A c                 *    [        U  SU SU S35      $ )zEGenerate a TypeError to be raised by function calls with wrong arity.z	() takes z positional arguments but z were given)rD   )rx   takesgivens      r   nargs_errorr   K  s(    vYug-Gwk+ , ,r   c                 v    [        U[        5      (       d  [        [        U5      5      n[	        U  SU S35      $ )a(  
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>   ri   rj   re   rD   )rx   kws     r   kwarg_errorr   Q  s7     b#$r(^vDRDJKKr   c              #   l   #    U v   U R                  5        H  n[        U5       Sh  vN   M     g N	7f)z8Yield *cls* and direct and indirect subclasses of *cls*.N)__subclasses__recursive_subclasses)ry   subclss     r   r   r   b  s.     
I$$&'/// '/s   &42
4c                    0 n[         R                  SS S:  aG  [        R                  " [        5      R
                  S   n[        US-  5      [        US-  5      4US'   O[         R                  " 5       n[        R                  " S5       HT  nUc  XRS'     OL[        R                  " S	UR                  R                  S
S5      5      (       d  XRS'     OUR                  nMV     A[        R                   " X40 UD6  g)a  
`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.).
N   )      
matplotlibmpl_toolkitsskip_file_prefixesr   
stacklevelz-\A(matplotlib|mpl_toolkits)(\Z|\.(?!tests\.))r&    )sysversion_infopathlibPath__file__parentsri   	_getframerf   rh   rematch	f_globalsgetf_backwarningswarn)messagecategoryrI   basedirframer   s         r   warn_externalr   i  s     F
w&,,x(003(+Gl,B(C(+Gn,D(E(G#$ #//!,J}'1|$88L!OO//
B?A A (2|$LLE - MM'.v.r   r   )r*   r}   rf   r   r   r   r   deprecationr   r   r   r   r   r	   r
   r   r   r   rM   rW   ro   rs   r   r   r   r   r   r   r   r-   r   r   <module>r      s{   
    	 
 " " " J )F 9= "B F:* F4n1h,L"0/r   