Current File : //proc/self/root/usr/lib/python3/dist-packages/twisted/python/__pycache__/deprecate.cpython-312.pyc
�

Ϫ�f�m����dZddlmZgd�ZddlZddlZddlmZddlm	Z	ddl
mZddlm
Z
mZmZmZmZmZdd	lmamZdd
lmZmZddlmZed�Zed
�ZdZd�Zde_de_de_ d�Z!d+d�Z"d,d�Z#d,d�Z$d�Z%	d+					d-d�Z&d+d�Z'd�Z(d�Z)Gd�d�Z*Gd�d�Z+Gd�d �Z,d!�Z-d"�Z.d#�Z/d$�Z0d%�Z1d&�Z2ed'ed(e
f�)�Z3	d+							d.d*�Z4y)/ah
Deprecation framework for Twisted.

To mark a method, function, or class as being deprecated do this::

    from incremental import Version
    from twisted.python.deprecate import deprecated

    @deprecated(Version("Twisted", 22, 10, 0))
    def badAPI(self, first, second):
        '''
        Docstring for badAPI.
        '''
        ...

    @deprecated(Version("Twisted", 22, 10, 0))
    class BadClass:
        '''
        Docstring for BadClass.
        '''

The newly-decorated badAPI will issue a warning when called, and BadClass will
issue a warning when instantiated. Both will also have  a deprecation notice
appended to their docstring.

To deprecate properties you can use::

    from incremental import Version
    from twisted.python.deprecate import deprecatedProperty

    class OtherwiseUndeprecatedClass:

        @deprecatedProperty(Version("Twisted", 22, 10, 0))
        def badProperty(self):
            '''
            Docstring for badProperty.
            '''

        @badProperty.setter
        def badProperty(self, value):
            '''
            Setter sill also raise the deprecation warning.
            '''


To mark module-level attributes as being deprecated you can use::

    badAttribute = "someValue"

    ...

    deprecatedModuleAttribute(
        Version("Twisted", 22, 10, 0),
        "Use goodAttribute instead.",
        "your.full.module.name",
        "badAttribute")

The deprecated attributes will issue a warning whenever they are accessed. If
the attributes being deprecated are in the same module as the
L{deprecatedModuleAttribute} call is being made from, the C{__name__} global
can be used as the C{moduleName} parameter.


To mark an optional, keyword parameter of a function or method as deprecated
without deprecating the function itself, you can use::

    @deprecatedKeywordParameter(Version("Twisted", 22, 10, 0), "baz")
    def someFunction(foo, bar=0, baz=None):
        ...

See also L{incremental.Version}.

@type DEPRECATION_WARNING_FORMAT: C{str}
@var DEPRECATION_WARNING_FORMAT: The default deprecation warning string format
    to use when one is not provided by the user.
�)�annotations)�
deprecated�deprecatedProperty�getDeprecationWarningString�getWarningMethod�setWarningMethod�deprecatedModuleAttribute�deprecatedKeywordParameterN)�findlinestarts��wraps)�
ModuleType)�Any�Callable�Dict�Optional�TypeVar�cast)�warn�
warn_explicit)�Version�getVersionString)�	ParamSpec�_P�_Rz&%(fqpn)s was deprecated in %(version)sc�0�	|j}tj|�stj
|�r|j}|�d|��Stj|�r|j�d|j��S|S#t$r|j}Y��wxYw)z�
    Return the fully qualified name of a module, class, method or function.
    Classes and functions need to be module level ones to be correctly
    qualified.

    @rtype: C{str}.
    �.)�__qualname__�AttributeError�__name__�inspect�isclass�
isfunction�
__module__�ismethod)�obj�name�
moduleNames   �:/usr/lib/python3/dist-packages/twisted/python/deprecate.py�_fullyQualifiedNamer*ss�����������s��w�1�1�#�6��^�^�
���Q�t�f�%�%�	�	�	�#�	��.�.�!��3�#3�#3�"4�5�5��K�����|�|���s�A=�=B�Bztwisted.python.reflect�fullyQualifiedNamec�:�t|�rt|�}d|�d�S)a

    Surround a replacement for a deprecated API with some polite text exhorting
    the user to consider it as an alternative.

    @type replacement: C{str} or callable

    @return: a string like "please use twisted.python.modules.getModule
        instead".
    zplease use z instead)�callabler*��replacements r)�_getReplacementStringr0�s%�����)�+�6��
��
�X�.�.�c�L�dt|���}|r|�dt|���}|dzS)a�
    Generate an addition to a deprecated object's docstring that explains its
    deprecation.

    @param version: the version it was deprecated.
    @type version: L{incremental.Version}

    @param replacement: The replacement, if specified.
    @type replacement: C{str} or callable

    @return: a string like "Deprecated in Twisted 27.2.0; please use
        twisted.timestream.tachyon.flux instead."
    zDeprecated in �; r)rr0)�versionr/�docs   r)�_getDeprecationDocstringr6�s;��
�+�G�4�5�
6�C����R�-�k�:�;�<����9�r1c�r�|�t}||t|�d�z}|rdj|t|��}|S)ag
    Return a string indicating that the Python name was deprecated in the given
    version.

    @param fqpn: Fully qualified Python name of the thing being deprecated
    @type fqpn: C{str}

    @param version: Version that C{fqpn} was deprecated in.
    @type version: L{incremental.Version}

    @param format: A user-provided format to interpolate warning values into, or
        L{DEPRECATION_WARNING_FORMAT
        <twisted.python.deprecate.DEPRECATION_WARNING_FORMAT>} if L{None} is
        given.
    @type format: C{str}

    @param replacement: what should be used in place of C{fqpn}. Either pass in
        a string, which will be inserted into the warning message, or a
        callable, which will be expanded to its full import path.
    @type replacement: C{str} or callable

    @return: A textual description of the deprecation
    @rtype: C{str}
    )�fqpnr4z{}; {})�DEPRECATION_WARNING_FORMATr�formatr0)r8r4r:r/�
warningStrings     r)�_getDeprecationWarningStringr<�sG��2�~�+���d�7G��7P�Q�Q�M�� ����0��=�
�
��r1c�0�tt|�|||�S)ak
    Return a string indicating that the callable was deprecated in the given
    version.

    @type callableThing: C{callable}
    @param callableThing: Callable object to be deprecated

    @type version: L{incremental.Version}
    @param version: Version that C{callableThing} was deprecated in.

    @type format: C{str}
    @param format: A user-provided format to interpolate warning values into,
        or L{DEPRECATION_WARNING_FORMAT
        <twisted.python.deprecate.DEPRECATION_WARNING_FORMAT>} if L{None} is
        given

    @param replacement: what should be used in place of the callable. Either
        pass in a string, which will be inserted into the warning message,
        or a callable, which will be expanded to its full import path.
    @type replacement: C{str} or callable

    @return: A string describing the deprecation.
    @rtype: C{str}
    )r<r*)�
callableThingr4r:r/s    r)rr�s��2(��M�*�G�V�[��r1c�V�|jr|jj�}ng}t|�dk(r|j|�nJt|�dk(r|j	d|dg�n'|j�}|j	d||z|g�dj
|�|_y)av
    Append the given text to the docstring of C{thingWithDoc}.

    If C{thingWithDoc} has no docstring, then the text just replaces the
    docstring. If it has a single-line docstring then it appends a blank line
    and the message text. If it has a multi-line docstring, then in appends a
    blank line a the message text, and also does the indentation correctly.
    r���
N)�__doc__�
splitlines�len�append�extend�pop�join)�thingWithDoc�textToAppend�docstringLines�spacess    r)�_appendToDocstringrN�s������%�-�-�8�8�:����
�>��a�����l�+�	�^�	��	!����r�<��4�5��#�#�%�����r�6�L�#8�&�A�B��9�9�^�4�L�r1c����d��fd�}|S)a�
    Return a decorator that marks callables as deprecated. To deprecate a
    property, see L{deprecatedProperty}.

    @type version: L{incremental.Version}
    @param version: The version in which the callable will be marked as
        having been deprecated.  The decorated function will be annotated
        with this version, having it set as its C{deprecatedVersion}
        attribute.

    @param replacement: what should be used in place of the callable. Either
        pass in a string, which will be inserted into the warning message,
        or a callable, which will be expanded to its full import path.
    @type replacement: C{str} or callable
    c�����t��d���t��d��fd��}t|t�����|_|S)zA
        Decorator that marks C{function} as deprecated.
        Nc�8��t�td���|i|��S�N���
stacklevel�r�DeprecationWarning��args�kwargs�functionr;s  ��r)�deprecatedFunctionzDdeprecated.<locals>.deprecationDecorator.<locals>.deprecatedFunction%� ����� 2�q�A��T�,�V�,�,r1)rYz_P.argsrZz	_P.kwargs�returnr)rr
rNr6�deprecatedVersion)r[r\r;r/r4s` @��r)�deprecationDecoratorz(deprecated.<locals>.deprecationDecoratorsX���4��g�t�[�
�
�
�x��	-�
�	-�	�� 8��+� N�	
�07��,�!�!r1)r[�Callable[_P, _R]r^ra�)r4r/r`s`` r)rr
s���&"�& �r1c�8����Gd�dt�����fd�}|S)a
    Return a decorator that marks a property as deprecated. To deprecate a
    regular callable or class, see L{deprecated}.

    @type version: L{incremental.Version}
    @param version: The version in which the callable will be marked as
        having been deprecated.  The decorated function will be annotated
        with this version, having it set as its C{deprecatedVersion}
        attribute.

    @param replacement: what should be used in place of the callable.
        Either pass in a string, which will be inserted into the warning
        message, or a callable, which will be expanded to its full import
        path.
    @type replacement: C{str} or callable

    @return: A new property with deprecated setter and getter.
    @rtype: C{property}

    @since: 16.1.0
    c��eZdZdZd�Zd�Zy)�/deprecatedProperty.<locals>._DeprecatedPropertyzQ
        Extension of the build-in property to allow deprecated setters.
        c�2���t����fd��}|S)Nc�L��t�jtd���|i|��SrR)rr;rW)rYrZr[�selfs  ��r)r\z^deprecatedProperty.<locals>._DeprecatedProperty._deprecatedWrapper.<locals>.deprecatedFunctionPs,�����&�&�&� ��
 ��0��0�0r1r)rhr[r\s`` r)�_deprecatedWrapperzBdeprecatedProperty.<locals>._DeprecatedProperty._deprecatedWrapperOs!���
�8�_�
1��
1�&�%r1c�L�tj||j|��S�N)�property�setterri)rhr[s  r)rmz6deprecatedProperty.<locals>._DeprecatedProperty.setter[s���?�?�4��)@�)@��)J�K�Kr1N)r r$rrCrirmrbr1r)�_DeprecatedPropertyreJs��	�
	&�	Lr1rnc�����t��d���t����fd��}t|t�����|_�|�}�|_|S)Nc�8��t�td���|i|��SrRrVrXs  ��r)r\zLdeprecatedProperty.<locals>.deprecationDecorator.<locals>.deprecatedFunctioncr]r1)rr
rNr6r_r;)r[r\�resultr;rnr/r4s`  @���r)r`z0deprecatedProperty.<locals>.deprecationDecorator^sh���3��g�t�[�
�
�
�x��	-�
�	-�	�� 8��+� N�	
�07��,�$�%7�8��,����
r1)rl)r4r/r`rns`` @r)rr3s���.L�h�L�(�& �r1c��tS)zR
    Return the warning method currently used to record deprecation warnings.
    �rrbr1r)rrts	���Kr1c��|ay)z�
    Set the warning method to use to record deprecation warnings.

    The callable should take message, category and stacklevel. The return
    value is ignored.
    Nrs)�	newMethods r)rr{s	���Dr1c�"�eZdZdZd�Zd�Zd�Zy)�_InternalStatez�
    An L{_InternalState} is a helper object for a L{_ModuleProxy}, so that it
    can easily access its own attributes, bypassing its logic for delegating to
    another object that it's proxying for.

    @ivar proxy: a L{_ModuleProxy}
    c�2�tj|d|�y�N�proxy)�object�__setattr__)rhrzs  r)�__init__z_InternalState.__init__�s�����4��%�0r1c�V�tjtj|d�|�Sry)r{�__getattribute__)rhr's  r)rz_InternalState.__getattribute__�s"���&�&�v�'>�'>�t�W�'M�t�T�Tr1c�X�tjtj|d�||�Sry)r{r|r)rhr'�values   r)r|z_InternalState.__setattr__�s%���!�!�&�"9�"9�$��"H�$�PU�V�Vr1N)r r$rrCr}rr|rbr1r)rwrw�s���1�U�Wr1rwc�*�eZdZdZd�Zdd�Zd�Zd�Zy)�_ModuleProxya�
    Python module wrapper to hook module-level attribute access.

    Access to deprecated attributes first checks
    L{_ModuleProxy._deprecatedAttributes}, if the attribute does not appear
    there then access falls through to L{_ModuleProxy._module}, the wrapped
    module object.

    @ivar _module: Module on which to hook attribute access.
    @type _module: C{module}

    @ivar _deprecatedAttributes: Mapping of attribute names to objects that
        retrieve the module attribute's original value.
    @type _deprecatedAttributes: C{dict} mapping C{str} to
        L{_DeprecatedAttribute}

    @ivar _lastWasPath: Heuristic guess as to whether warnings about this
        package should be ignored for the next call.  If the last attribute
        access of this module was a C{getattr} of C{__path__}, we will assume
        that it was the import system doing it and we won't emit a warning for
        the next access, even if it is to a deprecated attribute.  The CPython
        import system always tries to access C{__path__}, then the attribute
        itself, then the attribute itself again, in both successful and failed
        cases.
    @type _lastWasPath: C{bool}
    c�D�t|�}||_i|_d|_y)NF)rw�_module�_deprecatedAttributes�_lastWasPath)rh�module�states   r)r}z_ModuleProxy.__init__�s#���t�$����
�&(��#�"��r1c�d�t|�}dt|�j�d|j�d�S)z�
        Get a string containing the type of the module proxy and a
        representation of the wrapped module object.
        �<z module=�>)rw�typer r�)rhr�s  r)�__repr__z_ModuleProxy.__repr__�s3��
�t�$���4��:�&�&�'�x��
�
�/@��B�Br1c�V�t|�}d|_t|j||�y)z@
        Set an attribute on the wrapped module object.
        FN)rwr��setattrr�)rhr'r�r�s    r)r|z_ModuleProxy.__setattr__�s&���t�$��"�����
�
�t�U�+r1c���t|�}|jrd}n|jj|�}|�|j�}nt	|j
|�}|dk(r	d|_|Sd|_|S)aG
        Get an attribute from the module object, possibly emitting a warning.

        If the specified name has been deprecated, then a warning is issued.
        (Unless certain obscure conditions are met; see
        L{_ModuleProxy._lastWasPath} for more information about what might quash
        such a warning.)
        N�__path__TF)rwr�r��get�getattrr�)rhr'r��deprecatedAttributer�s     r)rz_ModuleProxy.__getattribute__�s����t�$�����"&��"'�"=�"=�"A�"A�$�"G���*�(�+�+�-�E��E�M�M�4�0�E��:��!%�E����"'�E���r1N)r^�str)r r$rrCr}r�r|rrbr1r)r�r��s���6#�C�,�r1r�c��eZdZdZd�Zd�Zy)�_DeprecatedAttributeaE
    Wrapper for deprecated attributes.

    This is intended to be used by L{_ModuleProxy}. Calling
    L{_DeprecatedAttribute.get} will issue a warning and retrieve the
    underlying attribute's value.

    @type module: C{module}
    @ivar module: The original module instance containing this attribute

    @type fqpn: C{str}
    @ivar fqpn: Fully qualified Python name for the deprecated attribute

    @type version: L{incremental.Version}
    @ivar version: Version that the attribute was deprecated in

    @type message: C{str}
    @ivar message: Deprecation message
    c�j�||_||_|jdz|z|_||_||_y)z7
        Initialise a deprecated name wrapper.
        rN)r�r r8r4�message)rhr�r'r4r�s     r)r}z_DeprecatedAttribute.__init__�s5�������
��O�O�c�)�D�0��	������r1c���t|j|j�}t|j|j
tdz|jz�}t|td��|S)zU
        Get the underlying attribute value and issue a deprecation warning.
        z: �rT)
r�r�r r<r8r4r9r�rrW)rhrqr�s   r)r�z_DeprecatedAttribute.getsT������d�m�m�4��.��I�I�t�|�|�%?�$�%F����%U�
��	
�W�(�Q�7��
r1N)r r$rrCr}r�rbr1r)r�r��s���(�
r1r�c��tj|d�}t||||�}tj|d�}|||<y)a�
    Mark a module-level attribute as being deprecated.

    @type proxy: L{_ModuleProxy}
    @param proxy: The module proxy instance proxying the deprecated attributes

    @type name: C{str}
    @param name: Attribute name

    @type version: L{incremental.Version}
    @param version: Version that the attribute was deprecated in

    @type message: C{str}
    @param message: Deprecation message
    r�r�N)r{rr�)rzr'r4r�r��attrr�s       r)�_deprecateAttributer�sG�� �%�%�e�Y�7�G����w��@�D�#�3�3�E�;R�S��"&��$�r1c��tj|}t|t�s,t	t
t|��}|tj|<t
||||�y)aE
    Declare a module-level attribute as being deprecated.

    @type version: L{incremental.Version}
    @param version: Version that the attribute was deprecated in

    @type message: C{str}
    @param message: Deprecation message

    @type moduleName: C{str}
    @param moduleName: Fully-qualified Python name of the module containing
        the deprecated attribute; if called from the same module as the
        attributes are being deprecated in, using the C{__name__} global can
        be helpful

    @type name: C{str}
    @param name: Attribute name to deprecate
    N)�sys�modules�
isinstancer�rrr�)r4r�r(r'r�s     r)r	r	0sI��&�[�[��
$�F��f�l�+��j�,�v�"6�7��"(����J�����g�w�7r1c��tj|j}t|ttj|�td�t|j�D��|j|jjdi�d��y)a�
    Issue a warning string, identifying C{offender} as the responsible code.

    This function is used to deprecate some behavior of a function.  It differs
    from L{warnings.warn} in that it is not limited to deprecating the behavior
    of a function currently on the call stack.

    @param offender: The function that is being deprecated.

    @param warningString: The string that should be emitted by this warning.
    @type warningString: C{str}

    @since: 11.0
    c3�*K�|]\}}|�|���
y�wrkrb)�.0�_�
lineNumbers   r)�	<genexpr>z$warnAboutFunction.<locals>.<genexpr>ds"����
���:��%�
�
�s��__warningregistry__N)�category�filename�linenor��registry�module_globals)
r�r�r$rrWr!�
getabsfile�maxr�__code__r �__globals__�
setdefault)�offenderr;�offenderModules   r)�warnAboutFunctionr�Ksy��(�[�[��!4�!4�5�N���#��#�#�N�3��
�!/��0A�0A�!B�
�
�
�&�&��%�%�0�0�1F��K��r1c��i}t|j�t|�z
}|j�ix}||j<|dkr<|j�t	d��|t|j�d||j<t|j|�D]
\}}|||<�|j
�D]D\}}||jvr||vrt	d��|||<�)|j�||<�;t	d��|S)a�
    Take an I{inspect.ArgSpec}, a tuple of positional arguments, and a dict of
    keyword arguments, and return a mapping of arguments that were actually
    passed to their passed values.

    @param argspec: The argument specification for the function to inspect.
    @type argspec: I{inspect.ArgSpec}

    @param positional: The positional arguments that were passed.
    @type positional: L{tuple}

    @param keyword: The keyword arguments that were passed.
    @type keyword: L{dict}

    @return: A dictionary mapping argument names (those declared in C{argspec})
        to values that were passed explicitly by the user.
    @rtype: L{dict} mapping L{str} to L{object}
    Nr�Too many arguments.�Already passed.�
no such param)rErY�keywords�varargs�	TypeError�zip�items)�argspec�
positional�keywordrq�unpassedrZr'r�s        r)�_passedArgSpecr�os��&!#�F��7�<�<� �3�z�?�2�H����#�,.�.����(�(�)��!�|��?�?�"��1�2�2�&0��W�\�\�1B�1D�&E�F�7�?�?�#��7�<�<��4����e���t����}�}��-���e��7�<�<���v�~�� 1�2�2� �F�4�L�
�
�
�
)� �F�4�L��O�,�,�-��Mr1c��i}d}d}t|jj��D�]b\}\}}|jtj
jk(r||d||<t||�dz}�K|jtj
jk(rix}||<�z|jtj
jtj
jfvr|t|�ks��||||<|dz
}��|jtj
jk(rL||vs��|jtj
jk(rtd|����|j||<��Jtd|�d|j����t|�|kDrtd��|j�D]H\}}	||jj�vr||vrtd��|	||<�7|�|	||<�?td	��|S)
a�
    Take an L{inspect.Signature}, a tuple of positional arguments, and a dict of
    keyword arguments, and return a mapping of arguments that were actually
    passed to their passed values.

    @param signature: The signature of the function to inspect.
    @type signature: L{inspect.Signature}

    @param positional: The positional arguments that were passed.
    @type positional: L{tuple}

    @param keyword: The keyword arguments that were passed.
    @type keyword: L{dict}

    @return: A dictionary mapping argument names (those declared in
        C{signature}) to values that were passed explicitly by the user.
    @rtype: L{dict} mapping L{str} to L{object}
    Nrr@zmissing keyword arg �'z' parameter is invalid kind: r�r�r�)�	enumerate�
parametersr��kindr!�	Parameter�VAR_POSITIONALrE�VAR_KEYWORD�POSITIONAL_OR_KEYWORD�POSITIONAL_ONLY�KEYWORD_ONLY�default�emptyr��keys)
�	signaturer�r�rqrZ�
numPositional�nr'�paramr�s
          r)�_passedSignaturer��s���&�F�
�F��M�%�i�&:�&:�&@�&@�&B�C�Q���=�D�%��:�:��*�*�9�9�9�%�a�b�>�F�4�L���t��-��1�M�
�Z�Z�7�,�,�8�8�
8�$&�&�F�V�D�\�
�Z�Z����3�3����-�-�
�
��3�z�?�"�)�!�}��t����"�
�
�Z�Z�7�,�,�9�9�
9��7�"��=�=�G�$5�$5�$;�$;�;�#�&:�4�&�$A�B�B�#(�=�=�F�4�L��a��v�%B�5�:�:�,�O�P�P�-Q�0�:���&��-�.�.��}�}��-���e��9�'�'�,�,�.�.��v�~�� 1�2�2� �F�4�L�
�
� �F�4�L��O�,�,�-��Mr1c����fd�}|S)a�
    Decorator which causes its decoratee to raise a L{TypeError} if two of the
    given arguments are passed at the same time.

    @param argumentPairs: pairs of argument identifiers, each pair indicating
        an argument that may not be passed in conjunction with another.
    @type argumentPairs: sequence of 2-sequences of L{str}

    @return: A decorator, used like so::

            @_mutuallyExclusiveArguments([["tweedledum", "tweedledee"]])
            def function(tweedledum=1, tweedledee=2):
                "Don't pass tweedledum and tweedledee at the same time."

    @rtype: 1-argument callable taking a callable and returning a callable.
    c�p�����tj���t�t������fd��}|S)Nc�����||�}�D],\}}||vs�||vs�td|�d|�dt���d����|i|��S)N�The z and z arguments to z are mutually exclusive.)r�r*)	rYrZ�	arguments�this�that�_passed�
argumentPairs�spec�wrappees	     ����r)�wrappedz=_mutuallyExclusiveArguments.<locals>.wrapper.<locals>.wrapped�se�����d�F�3�I�+�
�
��d��9�$���):�#���':�7�'C�E���
��D�+�F�+�+r1)r!r�r�r
)r�r�r�r�r�s` @@�r)�wrapperz,_mutuallyExclusiveArguments.<locals>.wrapper�s5���� � ��)��"��	�w��	,�
�	,��r1rb)r�r�s` r)�_mutuallyExclusiveArgumentsr��s���$�"�Nr1�_Tc.)�boundc�����d���fd�}|S)aw
    Return a decorator that marks a keyword parameter of a callable
    as deprecated. A warning will be emitted if a caller supplies
    a value for the parameter, whether the caller uses a keyword or
    positional syntax.

    @type version: L{incremental.Version}
    @param version: The version in which the parameter will be marked as
        having been deprecated.

    @type name: L{str}
    @param name: The name of the deprecated parameter.

    @type replacement: L{str}
    @param replacement: Optional text indicating what should be used in
        place of the deprecated parameter.

    @since: Twisted 21.2.0
    c�������td��dt�����	����dj�t�	��}�r|dzt	��z}|dz
}tj��j}�|vrM|�jt
jjk(r#t|�j�������fd�}n���fd�}ttt��|��}t!||�|S)	Nr�z parameter to r.z'The {!r} parameter was deprecated in {}r3rc�\��t|��kDs�|vrt�td���|i|��SrR)rErrW)rYrZr'�parameterIndexr;r�s  ����r)�checkDeprecatedParameterzMdeprecatedKeywordParameter.<locals>.wrapper.<locals>.checkDeprecatedParameter+s2����t�9�~�-������(:�q�I���/��/�/r1c�@���|vrt�td���|i|��SrRrV)rYrZr'r;r�s  ���r)r�zMdeprecatedKeywordParameter.<locals>.wrapper.<locals>.checkDeprecatedParameter2s'����6�>���(:�q�I���/��/�/r1)r<r*r:rr0r!r�r�r�r�r��list�indexrr�r
rN)
r�r5�paramsr��	decoratedr�r;r'r/r4s
`    @@���r)r�z+deprecatedKeywordParameter.<locals>.wrappers����4��4�(�.�)<�W�)E�(F�G��#�
�
�8�>�>���W�%�
�����*�4�[�A�A�C��s�
���"�"�7�+�6�6���F�N��t��!�!�W�%6�%6�%L�%L�L�!�&�\�/�/��5�N�
0�
0�
0�
��n�e�G�n�-E�F�G�	��9�c�*��r1)r�r�r^r�rb)r4r'r/r�s``` r)r
r
�s���.$�L�Nr1rk)NN)r4rr/z"str | Callable[..., object] | Noner^z.Callable[[Callable[_P, _R]], Callable[_P, _R]])r4rr'r�r/z
Optional[str]r^zCallable[[_Tc], _Tc])5rC�
__future__r�__all__r!r��disr�	functoolsr
�typesr�typingrrrrrr�warningsrr�incrementalrrrrrr9r*r$r rr0r6r<rrNrrrrrwr�r�r�r	r�r�r�r�r�r
rbr1r)�<module>r�sI��
K�X#����
����?�?�(�1���t�_���T�]��E���,":���3���#7�� �/��( �F�<5�2IM�& �
�& �#E�& �3�& �R> �B��W�W�&M�M�`,�,�^'�08�6!�H'�T9�x#�L�e�8�C��H�-�.��?C�=�
�=��=�.;�=��=r1
¿Qué es la limpieza dental de perros? - Clínica veterinaria


Es la eliminación del sarro y la placa adherida a la superficie de los dientes mediante un equipo de ultrasonidos que garantiza la integridad de las piezas dentales a la vez que elimina en profundidad cualquier resto de suciedad.

A continuación se procede al pulido de los dientes mediante una fresa especial que elimina la placa bacteriana y devuelve a los dientes el aspecto sano que deben tener.

Una vez terminado todo el proceso, se mantiene al perro en observación hasta que se despierta de la anestesia, bajo la atenta supervisión de un veterinario.

¿Cada cuánto tiempo tengo que hacerle una limpieza dental a mi perro?

A partir de cierta edad, los perros pueden necesitar una limpieza dental anual o bianual. Depende de cada caso. En líneas generales, puede decirse que los perros de razas pequeñas suelen acumular más sarro y suelen necesitar una atención mayor en cuanto a higiene dental.


Riesgos de una mala higiene


Los riesgos más evidentes de una mala higiene dental en los perros son los siguientes:

  • Cuando la acumulación de sarro no se trata, se puede producir una inflamación y retracción de las encías que puede descalzar el diente y provocar caídas.
  • Mal aliento (halitosis).
  • Sarro perros
  • Puede ir a más
  • Las bacterias de la placa pueden trasladarse a través del torrente circulatorio a órganos vitales como el corazón ocasionando problemas de endocarditis en las válvulas. Las bacterias pueden incluso acantonarse en huesos (La osteomielitis es la infección ósea, tanto cortical como medular) provocando mucho dolor y una artritis séptica).

¿Cómo se forma el sarro?

El sarro es la calcificación de la placa dental. Los restos de alimentos, junto con las bacterias presentes en la boca, van a formar la placa bacteriana o placa dental. Si la placa no se retira, al mezclarse con la saliva y los minerales presentes en ella, reaccionará formando una costra. La placa se calcifica y se forma el sarro.

El sarro, cuando se forma, es de color blanquecino pero a medida que pasa el tiempo se va poniendo amarillo y luego marrón.

Síntomas de una pobre higiene dental
La señal más obvia de una mala salud dental canina es el mal aliento.

Sin embargo, a veces no es tan fácil de detectar
Y hay perros que no se dejan abrir la boca por su dueño. Por ejemplo…

Recientemente nos trajeron a la clínica a un perro que parpadeaba de un ojo y decía su dueño que le picaba un lado de la cara. Tenía molestias y dificultad para comer, lo que había llevado a sus dueños a comprarle comida blanda (que suele ser un poco más cara y llevar más contenido en grasa) durante medio año. Después de una exploración oftalmológica, nos dimos cuenta de que el ojo tenía una úlcera en la córnea probablemente de rascarse . Además, el canto lateral del ojo estaba inflamado. Tenía lo que en humanos llamamos flemón pero como era un perro de pelo largo, no se le notaba a simple vista. Al abrirle la boca nos llamó la atención el ver una muela llena de sarro. Le realizamos una radiografía y encontramos una fístula que llegaba hasta la parte inferior del ojo.

Le tuvimos que extraer la muela. Tras esto, el ojo se curó completamente con unos colirios y una lentilla protectora de úlcera. Afortunadamente, la úlcera no profundizó y no perforó el ojo. Ahora el perro come perfectamente a pesar de haber perdido una muela.

¿Cómo mantener la higiene dental de tu perro?
Hay varias maneras de prevenir problemas derivados de la salud dental de tu perro.

Limpiezas de dientes en casa
Es recomendable limpiar los dientes de tu perro semanal o diariamente si se puede. Existe una gran variedad de productos que se pueden utilizar:

Pastas de dientes.
Cepillos de dientes o dedales para el dedo índice, que hacen más fácil la limpieza.
Colutorios para echar en agua de bebida o directamente sobre el diente en líquido o en spray.

En la Clínica Tus Veterinarios enseñamos a nuestros clientes a tomar el hábito de limpiar los dientes de sus perros desde que son cachorros. Esto responde a nuestro compromiso con la prevención de enfermedades caninas.

Hoy en día tenemos muchos clientes que limpian los dientes todos los días a su mascota, y como resultado, se ahorran el dinero de hacer limpiezas dentales profesionales y consiguen una mejor salud de su perro.


Limpiezas dentales profesionales de perros y gatos

Recomendamos hacer una limpieza dental especializada anualmente. La realizamos con un aparato de ultrasonidos que utiliza agua para quitar el sarro. Después, procedemos a pulir los dientes con un cepillo de alta velocidad y una pasta especial. Hacemos esto para proteger el esmalte.

La frecuencia de limpiezas dentales necesaria varía mucho entre razas. En general, las razas grandes tienen buena calidad de esmalte, por lo que no necesitan hacerlo tan a menudo e incluso pueden pasarse la vida sin requerir una limpieza. Sin embargo, razas pequeñas como el Yorkshire o el Maltés, deben hacérselas todos los años desde cachorros si se quiere conservar sus piezas dentales.

Otro factor fundamental es la calidad del pienso. Algunas marcas han diseñado croquetas que limpian la superficie del diente y de la muela al masticarse.

Ultrasonido para perros

¿Se necesita anestesia para las limpiezas dentales de perros y gatos?

La limpieza dental en perros no es una técnica que pueda practicarse sin anestesia general , aunque hay veces que los propietarios no quieren anestesiar y si tiene poco sarro y el perro es muy bueno se puede intentar…… , pero no se va a poder pulir ni acceder a todas la zona de la boca …. Además los limpiadores dentales van a irrigar agua y hay riesgo de aspiración a vías respiratorias si no se realiza una anestesia correcta con intubación traqueal . En resumen , sin anestesia no se va hacer una correcta limpieza dental.

Tampoco sirve la sedación ya que necesitamos que el animal esté totalmente quieto, y el veterinario tenga un acceso completo a todas sus piezas dentales y encías.

Alimentos para la limpieza dental

Hay que tener cierto cuidado a la hora de comprar determinados alimentos porque no todos son saludables. Algunos tienen demasiado contenido graso, que en exceso puede causar problemas cardiovasculares y obesidad.

Los mejores alimentos para los dientes son aquellos que están elaborados por empresas farmacéuticas y llevan componentes químicos con tratamientos específicos para el diente del perro. Esto implica no solo limpieza a través de la acción mecánica de morder sino también un tratamiento antibacteriano para prevenir el sarro.

Conclusión

Si eres como la mayoría de dueños, por falta de tiempo , es probable que no estés prestando la suficiente atención a la limpieza dental de tu perro. Por eso te animamos a que comiences a limpiar los dientes de tu perro y consideres atender a su higiene bucal con frecuencia.

Estas simples medidas pueden conllevar a que tu perro tenga una vida más larga y mucho más saludable.

Si te resulta imposible introducir un cepillo de dientes a tu perro en la boca, pásate con él por clínica Tus Veterinarios y te explicamos cómo hacerlo.

Necesitas hacer una limpieza dental profesional a tu mascota?
Llámanos al 622575274 o contacta con nosotros

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¡Hola!