bgFtddlmZddlZddlmZddlmZddlmZddlm Z m Z Gddej Z dS) ) annotationsN)nodes)checkers)utils)HIGH INFERENCEcTeZdZdZdddddddZd)d Zed*dZej ddd+dZ d+dZ d+dZ ej dddd,dZ d,dZd,dZej ddd-d Zd-d!Zd.d#Zej d$d/d&Zd/d'Zd(S)0RecommendationChecker refactoring)z@Consider using enumerate instead of iterating with range and lenconsider-using-enumeratez~Emitted when code that iterates with range and len is encountered. Such code can be simplified by using the enumerate builtin.)zEConsider iterating the dictionary directly instead of calling .keys()consider-iterating-dictionaryaEmitted when the keys of a dictionary are iterated through the ``.keys()`` method or when ``.keys()`` is used for a membership check. It is enough to iterate through the dictionary itself, ``for key in dictionary``. For membership checks, ``if key in dictionary`` is faster.)z Consider iterating with .items()consider-using-dict-itemszEmitted when iterating over the keys of a dictionary and accessing the value by index lookup. Both the key and value can be accessed by iterating using the .items() method of the dictionary instead.)zUse %s insteaduse-maxsplit-argzEmitted when accessing only the first or last element of str.split(). The first and last element can be accessed by using str.split(sep, maxsplit=1)[0] or str.rsplit(sep, maxsplit=1)[-1] instead.)z.Use a sequence type when iterating over valuesuse-sequence-for-iterationzvWhen iterating over values, sequence types (e.g., ``lists``, ``tuples``, ``ranges``) are more efficient than ``sets``.)z5Formatting a regular string which could be a f-stringconsider-using-f-stringzUsed when we detect a string that is being formatted with format() or % which could potentially be a f-string. The use of f-strings is preferred. Requires Python 3.6 and ``py-version >= 3.6``.)C0200C0201C0206C0207C0208C0209returnNonec>|jjj}|dk|_dS)N))linterconfig py_version _py36_plus)selfrs /builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/pylint/checkers/refactoring/recommendation_checker.pyopenzRecommendationChecker.openAs['2 $.node nodes.NodeNGfunctionstrboolcptj|}|sdStj|o |j|kS)NF)r safe_inferis_builtin_objectname)r%r'inferreds r" _is_builtinz!RecommendationChecker._is_builtinEs<#D)) 5&x00NX]h5NNr$r r nodes.CallcZ||||dSN)$_check_consider_iterating_dictionary_check_use_maxsplit_argr!r%s r" visit_callz RecommendationChecker.visit_callLs2 11$777 $$T*****r$ctjtjsdSjjdkrdStjtjrjjdvrdStj tj }tjtj tj fs"|rtfd|jDrutjj}t|t jrt|jtjsdS|dt*dSdSdS)Nkeys>&^|c3^K|]'\}}|dvr|vs|u#|V(dS)>not ininN)node_ancestors).0op comparatorr%s r" zMRecommendationChecker._check_consider_iterating_dictionary..`sc"B )))4#6#6#8#888J$splitrsplitNrsepmaxsplitcg|] }|j S)r-)r@ns r" zARecommendationChecker._check_use_maxsplit_arg..s'666'(AF666r$)rrbrZrY)r](z, maxsplit=1)[]r)r%args)#rFrGrrHrIrr+rRrSexprInstancerPnodes_of_classClassDefget_argument_from_callNoSuchArgumentErrorrJ Subscriptget_subscript_const_valuevalueInferredTypeErrorsliceNamescoperNWhile parent_of AugAssignr-targetAssigntargets as_stringrZrV) r!r% inferred_exprr[subscript_valuerr loop_nodeassignment_nodefn_namenew_fnnew_names r"r4z-RecommendationChecker._check_use_maxsplit_argps[ ty%/ 2 2  "&9995+DI668KLL: F(88 mW%5 6 6 3  ( ( 8 8< <   F .tQ>>CC(    FF    (q* = = = F(    D  dk5? 3 3 R "'"A$+"N"N"T*    $++UZ88 # !&!5!5uy%+6N!O!O # #I$..t44! ,5+C+CEO+T+T##;,1_5K5PPP"FFFQ+4+C+CEL+Q+Q##;,166,;,C666#FFF# '))),%4%:%:I''))0010EEaHK#--//KKKKKL   !3$h[ QQQQQA R R0*)s6CC21C26DD D E##E65E6r rr nodes.Forc||||||dSr2)_check_consider_using_enumerate _check_consider_using_dict_items!_check_use_sequence_for_iterationr5s r" visit_forzRecommendationChecker.visit_forsF ,,T222 --d333 ..t44444r$c`t|jtjsdS||jjdsdS|jjsdSt|jjdtjo|jjdjdk}t|jjdkr|sdSt|jjdkrdSt|jjdtjsdS|jjdj}||dsdS|jjdj}|rt|dkrdS|d}t|tj r tj }n)t|tj r tj }ndS| }t|tj r|j dkr |j d krdS|jD]'}|tjD]} t| j|s| j} t| tj s;| j | krk| j |jj krt| jtj r|j | jj ks4t| jtj r0|j| jjkr|d | dS)dS) z?Emit a convention whenever range and len are used for indexing.Nrangerrblenr\r!__iter__r r%)rFiterrCallr/rGreConstrnrrqrHrrr-bodyrhrlrprvrIrV) r!r%is_constant_zero second_funclen_argsiterating_objectexpected_subscript_val_typerrchild subscriptrns r"rz5RecommendationChecker._check_consider_using_enumerates$)UZ00  F 88  Fy~  F ty~a(%+ 6 6 W49>!;L;RVW;W  ty~  ! # #,< # F ty~   " " F$).,ej99  FinR(-  U33  F9>"%* 3x==A-- F#A; & 3 3 */* ' ' (%/ : : *// ' ' F  ' 4 4  %// j(( F Y  E"11%/BB   !)/3NOO!!%44?((**djjll:: :!111y ;;2(-1EEE!)/5?CCF(1Y_5MMM$$%?d$KKKFFF)   r$ctj|}|dS|jD]W}|tjD]3}t |jtjtj fs/|j }t |tjr2|j |j j ks||j kr||j ddj}||jkrt |jtjr||jjvs/t |jtjr||jj krdS|d|dSYdS)7Add message when accessing dict values by index lookup.Nr\rbrr)rget_iterating_dictionary_namerrhrrlrFrnrqrHrpr-rvrylookuplinenorJrwrxrurV)r!r%iterating_object_namerrrnlast_definition_linenos r"rz6RecommendationChecker._check_consider_using_dict_itemss{ !& CD I I ( F Y  E"11%/BB   !)/EJ3PQQ!"5%*55zT[%555, 0I0I0K0KKK).ej)A)A!)DR)H)O&)DK77 y/>>!Y%5%===!)"2EODD>!Y%5%<<<FFF  !<4 HHH;   r$nodes.ComprehensioncZ||||dSr2)._check_consider_using_dict_items_comprehensionrr5s r"visit_comprehensionz)RecommendationChecker.visit_comprehension1s2 ;;DAAA ..t44444r$ctj|}|dS|jD]}|t jD]}t|jt j t j fs.|j }t|t j r2|j |j j ks||jkr|d|dSdS)rNrr)rrrJ get_childrenrhrrlrFrnrqrHrpr-rvryrV)r!r%rrrrns r"rzDRecommendationChecker._check_consider_using_dict_items_comprehension9s!& CD I I ( F[--//  E"11%/BB   !)/EJ3PQQ!"5%*55zT[%555, 0I0I0K0KKK  !<4 HHH   r$nodes.For | nodes.Comprehensionct|jtjrEt t j|s&|d|jtdSdSdS)zrCheck if code iterates over an in-place defined set. Sets using `*` are not considered in-place. rrDN) rFrrSetrPrhas_starred_node_recursiverVrr5s r"rz7RecommendationChecker._check_use_sequence_for_iterationQs di + + C  ,T 2 25 5     ,49          r$r nodes.Constc|jrN|dkr8t|jtjs||dSdSdSdS)Nz builtins.str)r pytyperFrJr JoinedStr_detect_replacable_format_callr5s r" visit_constz!RecommendationChecker.visit_const_si ? :{{}}..z U_88.33D99999  : :....r$cnt|jtjr|jjdkrt|jjtjsdS|jjjr|jjjD]}t|tjrNtj |j }t|tj rt|jdkrdSd|vrdSn|jjjrdtj|j dD}|jjjD]}||jdkrdStj |j }t|tjr.t|jdkrt|dkrdS|d||j|jdSt|jtjr|jjd krd|jjvrdSt9|jjd r$t|jjj t<sdStj |jj}t|tjrt|jdkrdSn4t|tj rt|jdkrdS|d||j|jdSdSdS) z{Check whether a string is used in a call to format() or '%' and whether it can be replaced by an f-string. formatNr\\cg|] }|d S)rr_)r@is r"razHRecommendationChecker._detect_replacable_format_call..s)   AaD   r$rr)r%line col_offset%rn)rFrJrrHrIrreStarredrr+rnrRListreltsrykeywordsparse_format_method_stringcountargrUitemsrVrrrKrArighthasattrleftr()r!r%rr. keyword_argskeywordinferred_rights r"rz4RecommendationChecker._detect_replacable_format_callhsA t{EO 4 4I  $00dk0%*== {!& #;-2  C!#u}55##(#3CI#>#>&x>># #HM 2 2Q 6 6"FFs}}../ #, #  "'"B4:"N"Nq"Q     ${1: # #G#))'+66::#.w}==G"'5:66#w}--11c,6G6G!6K6K"FF   )[?       U[ 1 1 dkn6K6Kt{(2244444;+W55 Z  &>> "-dk.?@@N.%*55 ~+,,q00F1NEJ77 ~*++a//F   )[?      -  6K6Kr$N)rr)r%r&r'r(rr))r%r0rr)r%rrr)r%rrr)r%rrr)r%rrr)__name__ __module__ __qualname__r-msgsr# staticmethodr/ronly_required_for_messagesr6r3r4rrrrrrrrr_r$r"r r s D      O. . D`////OOO\O &U%');++++:>R>R>R>R@&U%"#$ 555  5 GGGGR,,,,\&U%#$555 50    &U%&?@@:::A@:MMMMMMr$r ) __future__rrRrpylintrpylint.checkersrpylint.interfacesrr BaseCheckerr r_r$r"rs #"""""!!!!!!--------fffffH0fffffr$