§
    öyIf26  ã                   óÜ   — d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ej	        ej
        ej        ej        fZ ed¦  «        Z ed¦  «        Zd	Zd
ej        defd„Z G d„ de¦  «        ZdS )z*Comparison checker from the basic checker.é    N)Únodes)Úutils)Ú_BasicChecker)ÚHIGH)ú==ú!=ú<ú>z<=z>=)Úisúis notr   r   zbuiltins.typeÚcallÚreturnc                 óv   — t          | t          j        ¦  «        ot          | j        ¦  «        dk    o| j         S )z3Is this a call with exactly 1 positional argument ?é   )Ú
isinstancer   ÚCallÚlenÚargsÚkeywords)r   s    ú[/var/www/piapp/venv/lib/python3.11/site-packages/pylint/checkers/base/comparison_checker.pyÚ_is_one_arg_pos_callr      s0   € å�d�EœJÑ'Ô'ÐU­C°´	©N¬N¸aÒ,?ÐUÈÌÐDUÐUó    c                   óÌ  — e Zd ZdZddddddgifdd	d
dddœZ	 d)dej        dej        dej        deddf
d„Z		 d)dej        dej        dej        deddf
d„Z
dej        dej        ddfd„Zdej        ddfd„Zdej        ddfd„Zdej        ddfd„Z ej        ddddd d!d"¦  «        dej        ddfd#„¦   «         Zdej        ddfd$„Zdej        d%ej        d&ed'ej        ddf
d(„ZdS )*ÚComparisonCheckera  Checks for comparisons.

    - singleton comparison: 'expr == True', 'expr == False' and 'expr == None'
    - yoda condition: 'const "comp" right' where comp can be '==', '!=', '<',
      '<=', '>' or '>=', and right can be a variable, an attribute, a method or
      a function
    )úComparison %s should be %súsingleton-comparisonzQUsed when an expression is compared to singleton values like True, False or None.z4Use isinstance() rather than type() for a typecheck.úunidiomatic-typecheckzÇThe idiomatic way to perform an explicit typecheck in Python is to use isinstance(x, Y) rather than type(x) == Y, type(x) is Y. Though there are unusual situations where these give different results.Ú	old_names)ÚW0154zold-unidiomatic-typecheck)zBIn '%s', use '%s' when comparing constant literals not '%s' ('%s')úliteral-comparisonz¨Used when comparing an object to a literal, which is usually what you do not want to do, since you can compare to a different literal than what was expected altogether.)zRedundant comparison - %súcomparison-with-itselfz/Used when something is compared against itself.)z=Comparison between constants: '%s %s %s' has a constant valueúcomparison-of-constantszÛWhen two literals are compared with each other the result is a constant. Using the constant directly is both easier to read and more performant. Initializing 'True' and 'False' this way is not required since Python 2.3.)z;Comparing against a callable, did you omit the parenthesis?úcomparison-with-callablezºThis message is emitted when pylint detects that a comparison with a callable was made, which might suggest that some parenthesis were omitted, resulting in potential unwanted behaviour.)r   únan-comparisonzRUsed when an expression is compared to NaN values like numpy.NaN and float('nan').)ÚC0121ÚC0123ÚR0123ÚR0124ÚR0133ÚW0143ÚW0177FÚ
left_valueÚright_valueÚ	root_nodeÚchecking_for_absencer   Nc           
      óú  — t          j        |¦  «        r
|j        |}}n t          j        |¦  «        r
|j        |}}ndS dddœ}|dv rÃd}dddœ}	d	d
dœ}
||u}|                     ||                              |                     ¦   «         |                     ¦   «         ¦  «        |t          j        |¦  «        s|rdnd                     |	|                              |                     ¦   «         ¦  «        ¦  «        |
|         ¦  «        }n@||                              |                     ¦   «         |                     ¦   «         ¦  «        }|                      d|d|                     ¦   «         › d�|f¬¦  «         dS )z=Check if == or != is being used to compare a singleton value.Nz
'{} is {}'z'{} is not {}')FT>   FTzB{} if checking for the singleton value {}, or {} if testing for {}znot {}z{}Ú
truthinessÚ	falsiness)TFz
'bool({})'z'{}'r   ú'©Únoder   )r   Úis_singleton_constÚvalueÚformatÚ	as_stringÚis_test_conditionÚadd_message)Úselfr,   r-   r.   r/   Ú	singletonÚother_valueÚsingleton_comparison_exampleÚsuggestion_templateÚtruthiness_exampleÚtruthiness_phraseÚchecking_truthinessÚ
suggestions                r   Ú_check_singleton_comparisonz-ComparisonChecker._check_singleton_comparisonT   sÛ  € õ Ô# JÑ/Ô/ð 	Ø%/Ô%5°{�{ˆIˆIÝÔ% kÑ2Ô2ð 	Ø%0Ô%6¸
�{ˆIˆIàˆFà/;ÐCSÐ'TÐ'TÐ$ð ˜Ð%Ð%àTð  ð *2¸Ð!>Ð!>ÐØ'3¸KÐ HÐ HÐð #,Ð3GÐ"GÐà,×3Ò3Ø,Ð-AÔB×IÒIØ×(Ò(Ñ*Ô*¨K×,AÒ,AÑ,CÔ,Cñô ð õ !Ô2°9Ñ=Ô=ð ØBUð �L�Làß’&Ø&Ð':Ô;×BÒBØ#×-Ò-Ñ/Ô/ñô ñô ð
 "Ð"5Ô6ñô ˆJˆJð" 6Ð6JÔK×RÒRØ×$Ò$Ñ&Ô&¨×(=Ò(=Ñ(?Ô(?ñô ˆJð 	×ÒØ"ØØ.�i×)Ò)Ñ+Ô+Ð.Ð.Ð.°
Ð;ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   c                 ó¬  ‡	‡
— dt           j        dt          fd„Š	dt           j        dt          fd„Š
dt           j        dt          fˆ	ˆ
fd„} ||¦  «        }|s ||¦  «        sd S d}|rd}|rd|› d	|                     ¦   «         › d
�}nd|› d	|                     ¦   «         › d
�}|                      d|d|                     ¦   «         › d�|f¬¦  «         d S )Nr5   r   c                 óB  — 	 t          | t          j        ¦  «        rrt          | j        ¦  «        dk    rZ| j        d         j                             ¦   «         dk    r2|                      ¦   «         d                              ¦   «         dk    rdS dS # t          $ r Y dS w xY w)Nr   r   Únanzbuiltins.floatTF)
r   r   r   r   r   r7   ÚlowerÚinferredÚpytypeÚAttributeError©r5   s    r   Ú_is_float_nanz>ComparisonChecker._check_nan_comparison.<locals>._is_float_nan“   sž   € ð	Ý˜d¥E¤JÑ/Ô/ð $µC¸¼	±N´NÀaÒ4GÐ4Gàœ	 !œÔ*×0Ò0Ñ2Ô2°eÒ;Ð;Ø ŸMšM™OœO¨AÔ.×5Ò5Ñ7Ô7Ð;KÒKÐKà#˜tØ�uøÝ!ð ð ð Ø�u�uðøøøs   ‚B
B Â
BÂBc                 óª   — t          | t          j        ¦  «        r8| j        dk    r-t          | j        t          j        ¦  «        r| j        j        dv S dS )NÚNaN>   ÚnpÚnmpÚnumpyF)r   r   Ú	AttributeÚattrnameÚexprÚNameÚnamerM   s    r   Ú_is_numpy_nanz>ComparisonChecker._check_nan_comparison.<locals>._is_numpy_nanŸ   sO   € Ý˜$¥¤Ñ0Ô0ð D°T´]ÀeÒ5KÐ5KÝ˜dœi­¬Ñ4Ô4ð DØœ9œ>Ð-CÐCÐCØ�5r   c                 ó0   •—  ‰| ¦  «        p
 ‰| ¦  «        S ©N© )r5   rN   rY   s    €€r   Ú_is_nanz8ComparisonChecker._check_nan_comparison.<locals>._is_nan¥   s"   ø€ Ø �= Ñ&Ô&Ð=¨-¨-¸Ñ*=Ô*=Ð=r   Ú znot r3   zmath.isnan(z)'r$   r4   )r   ÚNodeNGÚboolr9   r;   )r<   r,   r-   r.   r/   r]   Únan_leftÚabsence_textrD   rN   rY   s            @@r   Ú_check_nan_comparisonz'ComparisonChecker._check_nan_comparisonŒ   s_  øø€ ð
	¥¤ð 
	µð 
	ð 
	ð 
	ð 
	ð	¥¤ð 	µð 	ð 	ð 	ð 	ð	>�%œ,ð 	>­4ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð �7˜:Ñ&Ô&ˆØð 	  ¨Ñ 4Ô 4ð 	ØˆFàˆØð 	"Ø!ˆLØð 	QØQ˜\ÐQÐQ°k×6KÒ6KÑ6MÔ6MÐQÐQÐQˆJˆJàP˜\ÐPÐP°j×6JÒ6JÑ6LÔ6LÐPÐPÐPˆJØ×ÒØØØ.�i×)Ò)Ñ+Ô+Ð.Ð.Ð.°
Ð;ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   Úliteralr5   c                 óþ  — t          |t          j        t          j        t          j        f¦  «        }d}t          |t          j        ¦  «        rPt          |j        t          ¦  «        s|j        €dS t          |j        t          t          t          t          f¦  «        }|s|r[|                     ¦   «         }d|v rd}d}nd}d}|                     ||¦  «        }|                      d||||f|t          ¬¦  «         dS dS )	zMCheck if we compare to a literal, which is usually what we do not want to do.FNr   r   r   r   r    )r   r5   Ú
confidence)r   r   ÚListÚDictÚSetÚConstr7   r`   ÚbytesÚstrÚintÚfloatr9   Úreplacer;   r   )	r<   rd   r5   Úis_other_literalÚis_constÚincorrect_node_strÚequal_or_not_equalÚis_or_is_notÚfixed_node_strs	            r   Ú_check_literal_comparisonz+ComparisonChecker._check_literal_comparison¹   s#  € õ & gµ´
½E¼JÍÌ	Ð/RÑSÔSÐØˆÝ�g�uœ{Ñ+Ô+ð 	KÝ˜'œ-­Ñ.Ô.ð °'´-Ð2Gà�Ý! '¤-µ%½½cÅ5Ð1IÑJÔJˆHàð 	Ð'ð 	Ø!%§¢Ñ!1Ô!1ÐØÐ-Ð-Ð-Ø%)Ð"Ø'��à%)Ð"Ø#�Ø/×7Ò7ØÐ0ñô ˆNð ×ÒØ$à&Ø&Ø Ø"ð	ð Ýð ñ 
ô 
ð 
ð 
ð 
ð	ð 	r   c                 óÀ  — |j         }|j        d         d         }|j        d         d         }t          |t          j        ¦  «        r)t          |t          j        ¦  «        r|j        }|j        }nBt          |t          j        ¦  «        r(t          |t          j        ¦  «        r|j        }|j        }||k    r%|› d|› d|› �}|                      d||f¬¦  «         dS dS )zÃCheck if identifier is compared against itself.

        :param node: Compare node
        :Example:
        val = 786
        if val == val:  # [comparison-with-itself]
            pass
        r   r   ú r!   r4   N)	ÚleftÚopsr   r   rj   r7   rW   rX   r;   )r<   r5   Úleft_operandÚright_operandÚoperatorrD   s         r   Ú_check_logical_tautologyz*ComparisonChecker._check_logical_tautologyÜ   sù   € ð ”yˆØœ œ AœˆØ”8˜A”;˜q”>ˆÝ�l¥E¤KÑ0Ô0ð 		/µZØ�5œ;ñ6
ô 6
ð 		/ð (Ô-ˆLØ)Ô/ˆMˆMÝ˜¥e¤jÑ1Ô1ð 	/µjØ�5œ:ñ7
ô 7
ð 	/ð (Ô,ˆLØ)Ô.ˆMà˜=Ò(Ð(Ø(ÐEÐE¨8ÐEÐE°mÐEÐEˆJØ×ÒÐ5¸DÈ
À}ÐÑUÔUÐUÐUÐUð )Ð(r   c                 ó&  — |j         }t          |t          j        ¦  «        sdS |j        d         d         }t          |t          j        ¦  «        sdS |j        d         d         }|                      d||j        ||j        ft          ¬¦  «         dS )zGWhen two constants are being compared it is always a logical tautology.Nr   r   r"   )r5   r   rf   )ry   r   r   rj   rz   r;   r7   r   )r<   r5   r{   r|   r}   s        r   Ú_check_constants_comparisonz-ComparisonChecker._check_constants_comparison÷   s™   € à”yˆÝ˜,­¬Ñ4Ô4ð 	ØˆFàœ œ AœˆÝ˜-­¬Ñ5Ô5ð 	ØˆFà”8˜A”;˜q”>ˆØ×ÒØ%ØØÔ$ h°Ô0CÐDÝð	 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   c                 ó°  — |j         d         d         }|t          vrd S t          j        t          j        f}|j        |j         d         d         }}d}||fD ]_}t          j        |¦  «        }t          ||¦  «        r9d| 
                    ¦   «         vr#t          d„ |j        D ¦   «         ¦  «        s|dz  }Œ`|dk    r|                      d|¬¦  «         d S d S )Nr   r   ztyping._SpecialFormc              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S r[   )r   r   ÚRaise)Ú.0Úxs     r   ú	<genexpr>z?ComparisonChecker._check_callable_comparison.<locals>.<genexpr>  s.   è è € ÐNÐN¸1�J q­%¬+Ñ6Ô6ÐNÐNÐNÐNÐNÐNr   r#   rM   )rz   ÚCOMPARISON_OPERATORSr   ÚFunctionDefÚastroidÚBoundMethodry   r   Ú
safe_inferr   ÚdecoratornamesÚanyÚbodyr;   )	r<   r5   r}   Úbare_callablesr{   r|   Únumber_of_bare_callablesÚoperandrJ   s	            r   Ú_check_callable_comparisonz,ComparisonChecker._check_callable_comparison	  s  € Ø”8˜A”;˜q”>ˆØÕ/Ð/Ð/ØˆFåÔ+­WÔ-@ÐAˆØ&*¤i°´¸!´¸Q´�mˆð $%Ð Ø# ]Ð2ð 		.ð 		.ˆGÝÔ'¨Ñ0Ô0ˆHõ ˜8 ^Ñ4Ô4ð.à)°×1HÒ1HÑ1JÔ1JÐJÐJÝÐNÐNÀÄÐNÑNÔNÑNÔNð Kð )¨AÑ-Ð(øØ# qÒ(Ð(Ø×ÒÐ7¸dÐÑCÔCÐCÐCÐCð )Ð(r   r   r    r!   r"   r#   r$   c                 óÈ  — |                       |¦  «         |                      |¦  «         |                      |¦  «         |                      |¦  «         t	          |j        ¦  «        dk    rd S |j        }|j        d         \  }}|dv r|                      ||||dk    ¬¦  «         |dv r|                      ||||dv ¬¦  «         |dv r|  	                    ||¦  «         d S d S )	Nr   r   >   r   r   r   )r/   >   r   r   r   r   >   r   r   >   r   r   )
r’   r~   Ú_check_unidiomatic_typecheckr€   r   rz   ry   rE   rc   rv   )r<   r5   ry   r}   Úrights        r   Úvisit_comparezComparisonChecker.visit_compare   s&  € ð 	×'Ò'¨Ñ-Ô-Ð-Ø×%Ò% dÑ+Ô+Ð+Ø×)Ò)¨$Ñ/Ô/Ð/Ø×(Ò(¨Ñ.Ô.Ð.õ ˆtŒx‰=Œ=˜AÒÐØˆFàŒyˆØœ( 1œ+‰ˆ�%à�|Ð#Ð#Ø×,Ò,Ø�e˜T¸ÀDÒ8Hð -ñ ô ð ð Ð3Ð3Ð3Ø×&Ò&Ø�e˜T¸ÐDTÐ8Tð 'ñ ô ð ð Ð'Ð'Ð'Ø×*Ò*¨5°$Ñ7Ô7Ð7Ð7Ð7ð (Ð'r   c                 óœ   — |j         d         \  }}|t          v r0|j        }t          |¦  «        r|                      ||||¦  «         d S d S d S )Nr   )rz   ÚTYPECHECK_COMPARISON_OPERATORSry   r   Ú_check_type_x_is_y)r<   r5   r}   r•   ry   s        r   r”   z.ComparisonChecker._check_unidiomatic_typecheckB  si   € Øœ( 1œ+‰ˆ�%ØÕ5Ð5Ð5Ø”9ˆDÝ# DÑ)Ô)ð EØ×'Ò'¨¨d°H¸eÑDÔDÐDÐDÐDð 6Ð5ðEð Er   ry   r}   r•   c                 ó
  — t          j        |j        ¦  «        }t          |t          j        ¦  «        r|                     ¦   «         t          k    sdS |dv r•t          |¦  «        r†t          j        |j        ¦  «        }t          |t          j        ¦  «        rS|                     ¦   «         t          k    r6t          j        |j	        d         ¦  «        }t          |t          ¦  «        sdS |                      d|¬¦  «         dS )z(Check for expressions like type(x) == Y.N>   r   r   r   r   rM   )r   r‹   Úfuncr   r   ÚClassDefÚqnameÚ
TYPE_QNAMEr   r   ÚLITERAL_NODE_TYPESr;   )r<   r5   ry   r}   r•   Ú	left_funcÚ
right_funcÚ	right_args           r   r™   z$ComparisonChecker._check_type_x_is_yI  së   € õ Ô$ T¤YÑ/Ô/ˆ	å�y¥%¤.Ñ1Ô1ð	Ø6?·o²oÑ6GÔ6GÍ:Ò6UÐ6UàˆFàÐ'Ð'Ð'Õ,@ÀÑ,GÔ,GÐ'ÝÔ)¨%¬*Ñ5Ô5ˆJå˜:¥u¤~Ñ6Ô6ðà×$Ò$Ñ&Ô&­*Ò4Ð4õ "Ô,¨U¬Z¸¬]Ñ;Ô;�	Ý! )Õ-?Ñ@Ô@ð à�FØ×ÒÐ0°tÐÑ<Ô<Ð<Ð<Ð<r   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úmsgsr   r_   ÚComparer`   rE   rc   rv   r~   r€   r’   r   Úonly_required_for_messagesr–   r”   rl   r™   r\   r   r   r   r      s‰  € € € € € ðð ð
ð CØ#ð=ð ÐAÐBÐCð
ð
ð
ð

ð
ð
ðU0ð 0€Dðn &+ð6
ð 6
à”Lð6
ð ”\ð6
ð ”=ð	6
ð
 #ð6
ð 
ð6
ð 6
ð 6
ð 6
ðz &+ð+
ð +
à”Lð+
ð ”\ð+
ð ”=ð	+
ð
 #ð+
ð 
ð+
ð +
ð +
ð +
ðZ!Ø”|ð!Ø+0¬=ð!à	ð!ð !ð !ð !ðFV¨U¬]ð V¸tð Vð Vð Vð Vð6
°´ð 
À$ð 
ð 
ð 
ð 
ð$D¨u¬}ð DÀð Dð Dð Dð Dð. &€UÔ%ØØØØ Ø!Ø"Øñô ð8 %¤-ð 8°Dð 8ð 8ð 8ñô ð8ð2E°´ð EÀ4ð Eð Eð Eð Eð=àŒmð=ð Œlð=ð ð	=ð
 Œ|ð=ð 
ð=ð =ð =ð =ð =ð =r   r   )r¦   r‰   r   Úpylint.checkersr   Ú"pylint.checkers.base.basic_checkerr   Úpylint.interfacesr   rj   rh   rg   ri   rŸ   Ú	frozensetr‡   r˜   rž   r_   r`   r   r   r\   r   r   ú<module>r®      s  ðð
 1Ð 0à €€€Ø Ð Ð Ð Ð Ð à !Ð !Ð !Ð !Ð !Ð !Ø <Ð <Ð <Ð <Ð <Ð <Ø "Ð "Ð "Ð "Ð "Ð "à”k 5¤:¨u¬z¸5¼9ÐEÐ Ø �yÐ!CÑDÔDÐ Ø!* Ð+GÑ!HÔ!HÐ Ø€
ðV˜uœ|ð V°ð Vð Vð Vð Vð
I=ð I=ð I=ð I=ð I=˜ñ I=ô I=ð I=ð I=ð I=r   