Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

unittest_inference.py 144KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337
  1. # Copyright (c) 2006-2015 LOGILAB S.A. (Paris, FRANCE) <contact@logilab.fr>
  2. # Copyright (c) 2013-2014 Google, Inc.
  3. # Copyright (c) 2014-2016 Claudiu Popa <pcmanticore@gmail.com>
  4. # Copyright (c) 2015-2016 Cara Vinson <ceridwenv@gmail.com>
  5. # Copyright (c) 2015 Dmitry Pribysh <dmand@yandex.ru>
  6. # Copyright (c) 2015 Rene Zhang <rz99@cornell.edu>
  7. # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
  8. # For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER
  9. """tests for the astroid inference capabilities
  10. """
  11. # pylint: disable=too-many-lines
  12. import os
  13. import sys
  14. from functools import partial
  15. import unittest
  16. import warnings
  17. import six
  18. from astroid import InferenceError, builder, nodes
  19. from astroid.builder import parse, extract_node
  20. from astroid.inference import infer_end as inference_infer_end
  21. from astroid.bases import Instance, BoundMethod, UnboundMethod,\
  22. BUILTINS
  23. from astroid import arguments
  24. from astroid import decorators as decoratorsmod
  25. from astroid import exceptions
  26. from astroid import helpers
  27. from astroid import objects
  28. from astroid import test_utils
  29. from astroid import util
  30. from astroid.tests import resources
  31. def get_node_of_class(start_from, klass):
  32. return next(start_from.nodes_of_class(klass))
  33. builder = builder.AstroidBuilder()
  34. if sys.version_info < (3, 0):
  35. EXC_MODULE = 'exceptions'
  36. BOOL_SPECIAL_METHOD = '__nonzero__'
  37. else:
  38. EXC_MODULE = BUILTINS
  39. BOOL_SPECIAL_METHOD = '__bool__'
  40. class InferenceUtilsTest(unittest.TestCase):
  41. def test_path_wrapper(self):
  42. def infer_default(self, *args):
  43. raise InferenceError
  44. infer_default = decoratorsmod.path_wrapper(infer_default)
  45. infer_end = decoratorsmod.path_wrapper(inference_infer_end)
  46. with self.assertRaises(InferenceError):
  47. next(infer_default(1))
  48. self.assertEqual(next(infer_end(1)), 1)
  49. def _assertInferElts(node_type, self, node, elts):
  50. inferred = next(node.infer())
  51. self.assertIsInstance(inferred, node_type)
  52. self.assertEqual(sorted(elt.value for elt in inferred.elts),
  53. elts)
  54. def partialmethod(func, arg):
  55. """similar to functools.partial but return a lambda instead of a class so returned value may be
  56. turned into a method.
  57. """
  58. return lambda *args, **kwargs: func(arg, *args, **kwargs)
  59. class InferenceTest(resources.SysPathSetup, unittest.TestCase):
  60. # additional assertInfer* method for builtin types
  61. def assertInferConst(self, node, expected):
  62. inferred = next(node.infer())
  63. self.assertIsInstance(inferred, nodes.Const)
  64. self.assertEqual(inferred.value, expected)
  65. def assertInferDict(self, node, expected):
  66. inferred = next(node.infer())
  67. self.assertIsInstance(inferred, nodes.Dict)
  68. elts = set([(key.value, value.value)
  69. for (key, value) in inferred.items])
  70. self.assertEqual(sorted(elts), sorted(expected.items()))
  71. assertInferTuple = partialmethod(_assertInferElts, nodes.Tuple)
  72. assertInferList = partialmethod(_assertInferElts, nodes.List)
  73. assertInferSet = partialmethod(_assertInferElts, nodes.Set)
  74. assertInferFrozenSet = partialmethod(_assertInferElts, objects.FrozenSet)
  75. CODE = '''
  76. class C(object):
  77. "new style"
  78. attr = 4
  79. def meth1(self, arg1, optarg=0):
  80. var = object()
  81. print ("yo", arg1, optarg)
  82. self.iattr = "hop"
  83. return var
  84. def meth2(self):
  85. self.meth1(*self.meth3)
  86. def meth3(self, d=attr):
  87. b = self.attr
  88. c = self.iattr
  89. return b, c
  90. ex = Exception("msg")
  91. v = C().meth1(1)
  92. m_unbound = C.meth1
  93. m_bound = C().meth1
  94. a, b, c = ex, 1, "bonjour"
  95. [d, e, f] = [ex, 1.0, ("bonjour", v)]
  96. g, h = f
  97. i, (j, k) = "glup", f
  98. a, b= b, a # Gasp !
  99. '''
  100. ast = parse(CODE, __name__)
  101. def test_infer_abstract_property_return_values(self):
  102. module = parse('''
  103. import abc
  104. class A(object):
  105. @abc.abstractproperty
  106. def test(self):
  107. return 42
  108. a = A()
  109. x = a.test
  110. ''')
  111. inferred = next(module['x'].infer())
  112. self.assertIsInstance(inferred, nodes.Const)
  113. self.assertEqual(inferred.value, 42)
  114. def test_module_inference(self):
  115. inferred = self.ast.infer()
  116. obj = next(inferred)
  117. self.assertEqual(obj.name, __name__)
  118. self.assertEqual(obj.root().name, __name__)
  119. self.assertRaises(StopIteration, partial(next, inferred))
  120. def test_class_inference(self):
  121. inferred = self.ast['C'].infer()
  122. obj = next(inferred)
  123. self.assertEqual(obj.name, 'C')
  124. self.assertEqual(obj.root().name, __name__)
  125. self.assertRaises(StopIteration, partial(next, inferred))
  126. def test_function_inference(self):
  127. inferred = self.ast['C']['meth1'].infer()
  128. obj = next(inferred)
  129. self.assertEqual(obj.name, 'meth1')
  130. self.assertEqual(obj.root().name, __name__)
  131. self.assertRaises(StopIteration, partial(next, inferred))
  132. def test_builtin_name_inference(self):
  133. inferred = self.ast['C']['meth1']['var'].infer()
  134. var = next(inferred)
  135. self.assertEqual(var.name, 'object')
  136. self.assertEqual(var.root().name, BUILTINS)
  137. self.assertRaises(StopIteration, partial(next, inferred))
  138. def test_tupleassign_name_inference(self):
  139. inferred = self.ast['a'].infer()
  140. exc = next(inferred)
  141. self.assertIsInstance(exc, Instance)
  142. self.assertEqual(exc.name, 'Exception')
  143. self.assertEqual(exc.root().name, EXC_MODULE)
  144. self.assertRaises(StopIteration, partial(next, inferred))
  145. inferred = self.ast['b'].infer()
  146. const = next(inferred)
  147. self.assertIsInstance(const, nodes.Const)
  148. self.assertEqual(const.value, 1)
  149. self.assertRaises(StopIteration, partial(next, inferred))
  150. inferred = self.ast['c'].infer()
  151. const = next(inferred)
  152. self.assertIsInstance(const, nodes.Const)
  153. self.assertEqual(const.value, "bonjour")
  154. self.assertRaises(StopIteration, partial(next, inferred))
  155. def test_listassign_name_inference(self):
  156. inferred = self.ast['d'].infer()
  157. exc = next(inferred)
  158. self.assertIsInstance(exc, Instance)
  159. self.assertEqual(exc.name, 'Exception')
  160. self.assertEqual(exc.root().name, EXC_MODULE)
  161. self.assertRaises(StopIteration, partial(next, inferred))
  162. inferred = self.ast['e'].infer()
  163. const = next(inferred)
  164. self.assertIsInstance(const, nodes.Const)
  165. self.assertEqual(const.value, 1.0)
  166. self.assertRaises(StopIteration, partial(next, inferred))
  167. inferred = self.ast['f'].infer()
  168. const = next(inferred)
  169. self.assertIsInstance(const, nodes.Tuple)
  170. self.assertRaises(StopIteration, partial(next, inferred))
  171. def test_advanced_tupleassign_name_inference1(self):
  172. inferred = self.ast['g'].infer()
  173. const = next(inferred)
  174. self.assertIsInstance(const, nodes.Const)
  175. self.assertEqual(const.value, "bonjour")
  176. self.assertRaises(StopIteration, partial(next, inferred))
  177. inferred = self.ast['h'].infer()
  178. var = next(inferred)
  179. self.assertEqual(var.name, 'object')
  180. self.assertEqual(var.root().name, BUILTINS)
  181. self.assertRaises(StopIteration, partial(next, inferred))
  182. def test_advanced_tupleassign_name_inference2(self):
  183. inferred = self.ast['i'].infer()
  184. const = next(inferred)
  185. self.assertIsInstance(const, nodes.Const)
  186. self.assertEqual(const.value, u"glup")
  187. self.assertRaises(StopIteration, partial(next, inferred))
  188. inferred = self.ast['j'].infer()
  189. const = next(inferred)
  190. self.assertIsInstance(const, nodes.Const)
  191. self.assertEqual(const.value, "bonjour")
  192. self.assertRaises(StopIteration, partial(next, inferred))
  193. inferred = self.ast['k'].infer()
  194. var = next(inferred)
  195. self.assertEqual(var.name, 'object')
  196. self.assertEqual(var.root().name, BUILTINS)
  197. self.assertRaises(StopIteration, partial(next, inferred))
  198. def test_swap_assign_inference(self):
  199. inferred = self.ast.locals['a'][1].infer()
  200. const = next(inferred)
  201. self.assertIsInstance(const, nodes.Const)
  202. self.assertEqual(const.value, 1)
  203. self.assertRaises(StopIteration, partial(next, inferred))
  204. inferred = self.ast.locals['b'][1].infer()
  205. exc = next(inferred)
  206. self.assertIsInstance(exc, Instance)
  207. self.assertEqual(exc.name, 'Exception')
  208. self.assertEqual(exc.root().name, EXC_MODULE)
  209. self.assertRaises(StopIteration, partial(next, inferred))
  210. def test_getattr_inference1(self):
  211. inferred = self.ast['ex'].infer()
  212. exc = next(inferred)
  213. self.assertIsInstance(exc, Instance)
  214. self.assertEqual(exc.name, 'Exception')
  215. self.assertEqual(exc.root().name, EXC_MODULE)
  216. self.assertRaises(StopIteration, partial(next, inferred))
  217. def test_getattr_inference2(self):
  218. inferred = get_node_of_class(self.ast['C']['meth2'], nodes.Attribute).infer()
  219. meth1 = next(inferred)
  220. self.assertEqual(meth1.name, 'meth1')
  221. self.assertEqual(meth1.root().name, __name__)
  222. self.assertRaises(StopIteration, partial(next, inferred))
  223. def test_getattr_inference3(self):
  224. inferred = self.ast['C']['meth3']['b'].infer()
  225. const = next(inferred)
  226. self.assertIsInstance(const, nodes.Const)
  227. self.assertEqual(const.value, 4)
  228. self.assertRaises(StopIteration, partial(next, inferred))
  229. def test_getattr_inference4(self):
  230. inferred = self.ast['C']['meth3']['c'].infer()
  231. const = next(inferred)
  232. self.assertIsInstance(const, nodes.Const)
  233. self.assertEqual(const.value, "hop")
  234. self.assertRaises(StopIteration, partial(next, inferred))
  235. def test_callfunc_inference(self):
  236. inferred = self.ast['v'].infer()
  237. meth1 = next(inferred)
  238. self.assertIsInstance(meth1, Instance)
  239. self.assertEqual(meth1.name, 'object')
  240. self.assertEqual(meth1.root().name, BUILTINS)
  241. self.assertRaises(StopIteration, partial(next, inferred))
  242. def test_unbound_method_inference(self):
  243. inferred = self.ast['m_unbound'].infer()
  244. meth1 = next(inferred)
  245. self.assertIsInstance(meth1, UnboundMethod)
  246. self.assertEqual(meth1.name, 'meth1')
  247. self.assertEqual(meth1.parent.frame().name, 'C')
  248. self.assertRaises(StopIteration, partial(next, inferred))
  249. def test_bound_method_inference(self):
  250. inferred = self.ast['m_bound'].infer()
  251. meth1 = next(inferred)
  252. self.assertIsInstance(meth1, BoundMethod)
  253. self.assertEqual(meth1.name, 'meth1')
  254. self.assertEqual(meth1.parent.frame().name, 'C')
  255. self.assertRaises(StopIteration, partial(next, inferred))
  256. def test_args_default_inference1(self):
  257. optarg = test_utils.get_name_node(self.ast['C']['meth1'], 'optarg')
  258. inferred = optarg.infer()
  259. obj1 = next(inferred)
  260. self.assertIsInstance(obj1, nodes.Const)
  261. self.assertEqual(obj1.value, 0)
  262. obj1 = next(inferred)
  263. self.assertIs(obj1, util.Uninferable, obj1)
  264. self.assertRaises(StopIteration, partial(next, inferred))
  265. def test_args_default_inference2(self):
  266. inferred = self.ast['C']['meth3'].ilookup('d')
  267. obj1 = next(inferred)
  268. self.assertIsInstance(obj1, nodes.Const)
  269. self.assertEqual(obj1.value, 4)
  270. obj1 = next(inferred)
  271. self.assertIs(obj1, util.Uninferable, obj1)
  272. self.assertRaises(StopIteration, partial(next, inferred))
  273. def test_inference_restrictions(self):
  274. inferred = test_utils.get_name_node(self.ast['C']['meth1'], 'arg1').infer()
  275. obj1 = next(inferred)
  276. self.assertIs(obj1, util.Uninferable, obj1)
  277. self.assertRaises(StopIteration, partial(next, inferred))
  278. def test_ancestors_inference(self):
  279. code = '''
  280. class A(object): #@
  281. pass
  282. class A(A): #@
  283. pass
  284. '''
  285. a1, a2 = extract_node(code, __name__)
  286. a2_ancestors = list(a2.ancestors())
  287. self.assertEqual(len(a2_ancestors), 2)
  288. self.assertIs(a2_ancestors[0], a1)
  289. def test_ancestors_inference2(self):
  290. code = '''
  291. class A(object): #@
  292. pass
  293. class B(A): #@
  294. pass
  295. class A(B): #@
  296. pass
  297. '''
  298. a1, b, a2 = extract_node(code, __name__)
  299. a2_ancestors = list(a2.ancestors())
  300. self.assertEqual(len(a2_ancestors), 3)
  301. self.assertIs(a2_ancestors[0], b)
  302. self.assertIs(a2_ancestors[1], a1)
  303. def test_f_arg_f(self):
  304. code = '''
  305. def f(f=1):
  306. return f
  307. a = f()
  308. '''
  309. ast = parse(code, __name__)
  310. a = ast['a']
  311. a_inferred = a.inferred()
  312. self.assertEqual(a_inferred[0].value, 1)
  313. self.assertEqual(len(a_inferred), 1)
  314. def test_infered_warning(self):
  315. code = '''
  316. def f(f=1):
  317. return f
  318. a = f()
  319. '''
  320. ast = parse(code, __name__)
  321. a = ast['a']
  322. with warnings.catch_warnings(record=True) as w:
  323. with test_utils.enable_warning(PendingDeprecationWarning):
  324. a.infered()
  325. self.assertIsInstance(w[0].message, PendingDeprecationWarning)
  326. def test_exc_ancestors(self):
  327. code = '''
  328. def f():
  329. raise __(NotImplementedError)
  330. '''
  331. error = extract_node(code, __name__)
  332. nie = error.inferred()[0]
  333. self.assertIsInstance(nie, nodes.ClassDef)
  334. nie_ancestors = [c.name for c in nie.ancestors()]
  335. if sys.version_info < (3, 0):
  336. expected = ['RuntimeError', 'StandardError',
  337. 'Exception', 'BaseException', 'object']
  338. self.assertEqual(nie_ancestors, expected)
  339. else:
  340. expected = ['RuntimeError', 'Exception', 'BaseException', 'object']
  341. self.assertEqual(nie_ancestors, expected)
  342. def test_except_inference(self):
  343. code = '''
  344. try:
  345. print (hop)
  346. except NameError as ex:
  347. ex1 = ex
  348. except Exception as ex:
  349. ex2 = ex
  350. raise
  351. '''
  352. ast = parse(code, __name__)
  353. ex1 = ast['ex1']
  354. ex1_infer = ex1.infer()
  355. ex1 = next(ex1_infer)
  356. self.assertIsInstance(ex1, Instance)
  357. self.assertEqual(ex1.name, 'NameError')
  358. self.assertRaises(StopIteration, partial(next, ex1_infer))
  359. ex2 = ast['ex2']
  360. ex2_infer = ex2.infer()
  361. ex2 = next(ex2_infer)
  362. self.assertIsInstance(ex2, Instance)
  363. self.assertEqual(ex2.name, 'Exception')
  364. self.assertRaises(StopIteration, partial(next, ex2_infer))
  365. def test_del1(self):
  366. code = '''
  367. del undefined_attr
  368. '''
  369. delete = extract_node(code, __name__)
  370. self.assertRaises(InferenceError, delete.infer)
  371. def test_del2(self):
  372. code = '''
  373. a = 1
  374. b = a
  375. del a
  376. c = a
  377. a = 2
  378. d = a
  379. '''
  380. ast = parse(code, __name__)
  381. n = ast['b']
  382. n_infer = n.infer()
  383. inferred = next(n_infer)
  384. self.assertIsInstance(inferred, nodes.Const)
  385. self.assertEqual(inferred.value, 1)
  386. self.assertRaises(StopIteration, partial(next, n_infer))
  387. n = ast['c']
  388. n_infer = n.infer()
  389. self.assertRaises(InferenceError, partial(next, n_infer))
  390. n = ast['d']
  391. n_infer = n.infer()
  392. inferred = next(n_infer)
  393. self.assertIsInstance(inferred, nodes.Const)
  394. self.assertEqual(inferred.value, 2)
  395. self.assertRaises(StopIteration, partial(next, n_infer))
  396. def test_builtin_types(self):
  397. code = '''
  398. l = [1]
  399. t = (2,)
  400. d = {}
  401. s = ''
  402. s2 = '_'
  403. '''
  404. ast = parse(code, __name__)
  405. n = ast['l']
  406. inferred = next(n.infer())
  407. self.assertIsInstance(inferred, nodes.List)
  408. self.assertIsInstance(inferred, Instance)
  409. self.assertEqual(inferred.getitem(nodes.Const(0)).value, 1)
  410. self.assertIsInstance(inferred._proxied, nodes.ClassDef)
  411. self.assertEqual(inferred._proxied.name, 'list')
  412. self.assertIn('append', inferred._proxied.locals)
  413. n = ast['t']
  414. inferred = next(n.infer())
  415. self.assertIsInstance(inferred, nodes.Tuple)
  416. self.assertIsInstance(inferred, Instance)
  417. self.assertEqual(inferred.getitem(nodes.Const(0)).value, 2)
  418. self.assertIsInstance(inferred._proxied, nodes.ClassDef)
  419. self.assertEqual(inferred._proxied.name, 'tuple')
  420. n = ast['d']
  421. inferred = next(n.infer())
  422. self.assertIsInstance(inferred, nodes.Dict)
  423. self.assertIsInstance(inferred, Instance)
  424. self.assertIsInstance(inferred._proxied, nodes.ClassDef)
  425. self.assertEqual(inferred._proxied.name, 'dict')
  426. self.assertIn('get', inferred._proxied.locals)
  427. n = ast['s']
  428. inferred = next(n.infer())
  429. self.assertIsInstance(inferred, nodes.Const)
  430. self.assertIsInstance(inferred, Instance)
  431. self.assertEqual(inferred.name, 'str')
  432. self.assertIn('lower', inferred._proxied.locals)
  433. n = ast['s2']
  434. inferred = next(n.infer())
  435. self.assertEqual(inferred.getitem(nodes.Const(0)).value, '_')
  436. code = 's = {1}'
  437. ast = parse(code, __name__)
  438. n = ast['s']
  439. inferred = next(n.infer())
  440. self.assertIsInstance(inferred, nodes.Set)
  441. self.assertIsInstance(inferred, Instance)
  442. self.assertEqual(inferred.name, 'set')
  443. self.assertIn('remove', inferred._proxied.locals)
  444. @test_utils.require_version(maxver='3.0')
  445. def test_unicode_type(self):
  446. code = '''u = u""'''
  447. ast = parse(code, __name__)
  448. n = ast['u']
  449. inferred = next(n.infer())
  450. self.assertIsInstance(inferred, nodes.Const)
  451. self.assertIsInstance(inferred, Instance)
  452. self.assertEqual(inferred.name, 'unicode')
  453. self.assertIn('lower', inferred._proxied.locals)
  454. @unittest.expectedFailure
  455. def test_descriptor_are_callable(self):
  456. code = '''
  457. class A:
  458. statm = staticmethod(open)
  459. clsm = classmethod('whatever')
  460. '''
  461. ast = parse(code, __name__)
  462. statm = next(ast['A'].igetattr('statm'))
  463. self.assertTrue(statm.callable())
  464. clsm = next(ast['A'].igetattr('clsm'))
  465. self.assertFalse(clsm.callable())
  466. def test_bt_ancestor_crash(self):
  467. code = '''
  468. class Warning(Warning):
  469. pass
  470. '''
  471. ast = parse(code, __name__)
  472. w = ast['Warning']
  473. ancestors = w.ancestors()
  474. ancestor = next(ancestors)
  475. self.assertEqual(ancestor.name, 'Warning')
  476. self.assertEqual(ancestor.root().name, EXC_MODULE)
  477. ancestor = next(ancestors)
  478. self.assertEqual(ancestor.name, 'Exception')
  479. self.assertEqual(ancestor.root().name, EXC_MODULE)
  480. ancestor = next(ancestors)
  481. self.assertEqual(ancestor.name, 'BaseException')
  482. self.assertEqual(ancestor.root().name, EXC_MODULE)
  483. ancestor = next(ancestors)
  484. self.assertEqual(ancestor.name, 'object')
  485. self.assertEqual(ancestor.root().name, BUILTINS)
  486. self.assertRaises(StopIteration, partial(next, ancestors))
  487. def test_qqch(self):
  488. code = '''
  489. from astroid.modutils import load_module_from_name
  490. xxx = load_module_from_name('__pkginfo__')
  491. '''
  492. ast = parse(code, __name__)
  493. xxx = ast['xxx']
  494. self.assertSetEqual({n.__class__ for n in xxx.inferred()},
  495. {nodes.Const, util.Uninferable.__class__})
  496. def test_method_argument(self):
  497. code = '''
  498. class ErudiEntitySchema:
  499. """a entity has a type, a set of subject and or object relations"""
  500. def __init__(self, e_type, **kwargs):
  501. kwargs['e_type'] = e_type.capitalize().encode()
  502. def meth(self, e_type, *args, **kwargs):
  503. kwargs['e_type'] = e_type.capitalize().encode()
  504. print(args)
  505. '''
  506. ast = parse(code, __name__)
  507. arg = test_utils.get_name_node(ast['ErudiEntitySchema']['__init__'], 'e_type')
  508. self.assertEqual([n.__class__ for n in arg.infer()],
  509. [util.Uninferable.__class__])
  510. arg = test_utils.get_name_node(ast['ErudiEntitySchema']['__init__'], 'kwargs')
  511. self.assertEqual([n.__class__ for n in arg.infer()],
  512. [nodes.Dict])
  513. arg = test_utils.get_name_node(ast['ErudiEntitySchema']['meth'], 'e_type')
  514. self.assertEqual([n.__class__ for n in arg.infer()],
  515. [util.Uninferable.__class__])
  516. arg = test_utils.get_name_node(ast['ErudiEntitySchema']['meth'], 'args')
  517. self.assertEqual([n.__class__ for n in arg.infer()],
  518. [nodes.Tuple])
  519. arg = test_utils.get_name_node(ast['ErudiEntitySchema']['meth'], 'kwargs')
  520. self.assertEqual([n.__class__ for n in arg.infer()],
  521. [nodes.Dict])
  522. def test_tuple_then_list(self):
  523. code = '''
  524. def test_view(rql, vid, tags=()):
  525. tags = list(tags)
  526. __(tags).append(vid)
  527. '''
  528. name = extract_node(code, __name__)
  529. it = name.infer()
  530. tags = next(it)
  531. self.assertIsInstance(tags, nodes.List)
  532. self.assertEqual(tags.elts, [])
  533. with self.assertRaises(StopIteration):
  534. next(it)
  535. def test_mulassign_inference(self):
  536. code = '''
  537. def first_word(line):
  538. """Return the first word of a line"""
  539. return line.split()[0]
  540. def last_word(line):
  541. """Return last word of a line"""
  542. return line.split()[-1]
  543. def process_line(word_pos):
  544. """Silly function: returns (ok, callable) based on argument.
  545. For test purpose only.
  546. """
  547. if word_pos > 0:
  548. return (True, first_word)
  549. elif word_pos < 0:
  550. return (True, last_word)
  551. else:
  552. return (False, None)
  553. if __name__ == '__main__':
  554. line_number = 0
  555. for a_line in file('test_callable.py'):
  556. tupletest = process_line(line_number)
  557. (ok, fct) = process_line(line_number)
  558. if ok:
  559. fct(a_line)
  560. '''
  561. ast = parse(code, __name__)
  562. self.assertEqual(len(list(ast['process_line'].infer_call_result(None))), 3)
  563. self.assertEqual(len(list(ast['tupletest'].infer())), 3)
  564. values = ['<FunctionDef.first_word', '<FunctionDef.last_word',
  565. '<Const.NoneType']
  566. self.assertTrue(all(repr(inferred).startswith(value) for inferred, value
  567. in zip(ast['fct'].infer(), values)))
  568. def test_float_complex_ambiguity(self):
  569. code = '''
  570. def no_conjugate_member(magic_flag): #@
  571. """should not raise E1101 on something.conjugate"""
  572. if magic_flag:
  573. something = 1.0
  574. else:
  575. something = 1.0j
  576. if isinstance(something, float):
  577. return something
  578. return __(something).conjugate()
  579. '''
  580. func, retval = extract_node(code, __name__)
  581. self.assertEqual(
  582. [i.value for i in func.ilookup('something')],
  583. [1.0, 1.0j])
  584. self.assertEqual(
  585. [i.value for i in retval.infer()],
  586. [1.0, 1.0j])
  587. def test_lookup_cond_branches(self):
  588. code = '''
  589. def no_conjugate_member(magic_flag):
  590. """should not raise E1101 on something.conjugate"""
  591. something = 1.0
  592. if magic_flag:
  593. something = 1.0j
  594. return something.conjugate()
  595. '''
  596. ast = parse(code, __name__)
  597. values = [i.value for i in test_utils.get_name_node(ast, 'something', -1).infer()]
  598. self.assertEqual(values, [1.0, 1.0j])
  599. def test_simple_subscript(self):
  600. code = '''
  601. class A(object):
  602. def __getitem__(self, index):
  603. return index + 42
  604. [1, 2, 3][0] #@
  605. (1, 2, 3)[1] #@
  606. (1, 2, 3)[-1] #@
  607. [1, 2, 3][0] + (2, )[0] + (3, )[-1] #@
  608. e = {'key': 'value'}
  609. e['key'] #@
  610. "first"[0] #@
  611. list([1, 2, 3])[-1] #@
  612. tuple((4, 5, 6))[2] #@
  613. A()[0] #@
  614. A()[-1] #@
  615. '''
  616. ast_nodes = extract_node(code, __name__)
  617. expected = [1, 2, 3, 6, 'value', 'f', 3, 6, 42, 41]
  618. for node, expected_value in zip(ast_nodes, expected):
  619. inferred = next(node.infer())
  620. self.assertIsInstance(inferred, nodes.Const)
  621. self.assertEqual(inferred.value, expected_value)
  622. def test_invalid_subscripts(self):
  623. ast_nodes = extract_node('''
  624. class NoGetitem(object):
  625. pass
  626. class InvalidGetitem(object):
  627. def __getitem__(self): pass
  628. class InvalidGetitem2(object):
  629. __getitem__ = 42
  630. NoGetitem()[4] #@
  631. InvalidGetitem()[5] #@
  632. InvalidGetitem2()[10] #@
  633. ''')
  634. for node in ast_nodes[:3]:
  635. self.assertRaises(InferenceError, next, node.infer())
  636. for node in ast_nodes[3:]:
  637. self.assertEqual(next(node.infer()), util.Uninferable)
  638. ast_nodes = extract_node('''
  639. [1, 2, 3][None] #@
  640. 'lala'['bala'] #@
  641. ''')
  642. for node in ast_nodes:
  643. self.assertRaises(InferenceError, next, node.infer())
  644. def test_bytes_subscript(self):
  645. node = extract_node('''b'a'[0]''')
  646. inferred = next(node.infer())
  647. self.assertIsInstance(inferred, nodes.Const)
  648. if six.PY2:
  649. self.assertEqual(inferred.value, 'a')
  650. else:
  651. self.assertEqual(inferred.value, 97)
  652. def test_simple_tuple(self):
  653. module = parse("""
  654. a = (1,)
  655. b = (22,)
  656. some = a + b #@
  657. """)
  658. ast = next(module['some'].infer())
  659. self.assertIsInstance(ast, nodes.Tuple)
  660. self.assertEqual(len(ast.elts), 2)
  661. self.assertEqual(ast.elts[0].value, 1)
  662. self.assertEqual(ast.elts[1].value, 22)
  663. def test_simple_for(self):
  664. code = '''
  665. for a in [1, 2, 3]:
  666. print (a)
  667. for b,c in [(1,2), (3,4)]:
  668. print (b)
  669. print (c)
  670. print ([(d,e) for e,d in ([1,2], [3,4])])
  671. '''
  672. ast = parse(code, __name__)
  673. self.assertEqual([i.value for i in
  674. test_utils.get_name_node(ast, 'a', -1).infer()], [1, 2, 3])
  675. self.assertEqual([i.value for i in
  676. test_utils.get_name_node(ast, 'b', -1).infer()], [1, 3])
  677. self.assertEqual([i.value for i in
  678. test_utils.get_name_node(ast, 'c', -1).infer()], [2, 4])
  679. self.assertEqual([i.value for i in
  680. test_utils.get_name_node(ast, 'd', -1).infer()], [2, 4])
  681. self.assertEqual([i.value for i in
  682. test_utils.get_name_node(ast, 'e', -1).infer()], [1, 3])
  683. def test_simple_for_genexpr(self):
  684. code = '''
  685. print ((d,e) for e,d in ([1,2], [3,4]))
  686. '''
  687. ast = parse(code, __name__)
  688. self.assertEqual([i.value for i in
  689. test_utils.get_name_node(ast, 'd', -1).infer()], [2, 4])
  690. self.assertEqual([i.value for i in
  691. test_utils.get_name_node(ast, 'e', -1).infer()], [1, 3])
  692. def test_builtin_help(self):
  693. code = '''
  694. help()
  695. '''
  696. # XXX failing since __builtin__.help assignment has
  697. # been moved into a function...
  698. node = extract_node(code, __name__)
  699. inferred = list(node.func.infer())
  700. self.assertEqual(len(inferred), 1, inferred)
  701. self.assertIsInstance(inferred[0], Instance)
  702. self.assertEqual(inferred[0].name, "_Helper")
  703. def test_builtin_open(self):
  704. code = '''
  705. open("toto.txt")
  706. '''
  707. node = extract_node(code, __name__).func
  708. inferred = list(node.infer())
  709. self.assertEqual(len(inferred), 1)
  710. if hasattr(sys, 'pypy_version_info'):
  711. self.assertIsInstance(inferred[0], nodes.ClassDef)
  712. self.assertEqual(inferred[0].name, 'file')
  713. else:
  714. self.assertIsInstance(inferred[0], nodes.FunctionDef)
  715. self.assertEqual(inferred[0].name, 'open')
  716. if os.name == 'java':
  717. test_builtin_open = unittest.expectedFailure(test_builtin_open)
  718. def test_callfunc_context_func(self):
  719. code = '''
  720. def mirror(arg=None):
  721. return arg
  722. un = mirror(1)
  723. '''
  724. ast = parse(code, __name__)
  725. inferred = list(ast.igetattr('un'))
  726. self.assertEqual(len(inferred), 1)
  727. self.assertIsInstance(inferred[0], nodes.Const)
  728. self.assertEqual(inferred[0].value, 1)
  729. def test_callfunc_context_lambda(self):
  730. code = '''
  731. mirror = lambda x=None: x
  732. un = mirror(1)
  733. '''
  734. ast = parse(code, __name__)
  735. inferred = list(ast.igetattr('mirror'))
  736. self.assertEqual(len(inferred), 1)
  737. self.assertIsInstance(inferred[0], nodes.Lambda)
  738. inferred = list(ast.igetattr('un'))
  739. self.assertEqual(len(inferred), 1)
  740. self.assertIsInstance(inferred[0], nodes.Const)
  741. self.assertEqual(inferred[0].value, 1)
  742. def test_factory_method(self):
  743. code = '''
  744. class Super(object):
  745. @classmethod
  746. def instance(cls):
  747. return cls()
  748. class Sub(Super):
  749. def method(self):
  750. print ('method called')
  751. sub = Sub.instance()
  752. '''
  753. ast = parse(code, __name__)
  754. inferred = list(ast.igetattr('sub'))
  755. self.assertEqual(len(inferred), 1)
  756. self.assertIsInstance(inferred[0], Instance)
  757. self.assertEqual(inferred[0]._proxied.name, 'Sub')
  758. def test_import_as(self):
  759. code = '''
  760. import os.path as osp
  761. print (osp.dirname(__file__))
  762. from os.path import exists as e
  763. assert e(__file__)
  764. '''
  765. ast = parse(code, __name__)
  766. inferred = list(ast.igetattr('osp'))
  767. self.assertEqual(len(inferred), 1)
  768. self.assertIsInstance(inferred[0], nodes.Module)
  769. self.assertEqual(inferred[0].name, 'os.path')
  770. inferred = list(ast.igetattr('e'))
  771. self.assertEqual(len(inferred), 1)
  772. self.assertIsInstance(inferred[0], nodes.FunctionDef)
  773. self.assertEqual(inferred[0].name, 'exists')
  774. def _test_const_inferred(self, node, value):
  775. inferred = list(node.infer())
  776. self.assertEqual(len(inferred), 1)
  777. self.assertIsInstance(inferred[0], nodes.Const)
  778. self.assertEqual(inferred[0].value, value)
  779. def test_unary_not(self):
  780. for code in ('a = not (1,); b = not ()',
  781. 'a = not {1:2}; b = not {}',
  782. 'a = not [1, 2]; b = not []',
  783. 'a = not {1, 2}; b = not set()',
  784. 'a = not 1; b = not 0',
  785. 'a = not "a"; b = not ""',
  786. 'a = not b"a"; b = not b""'):
  787. ast = builder.string_build(code, __name__, __file__)
  788. self._test_const_inferred(ast['a'], False)
  789. self._test_const_inferred(ast['b'], True)
  790. def test_unary_op_numbers(self):
  791. ast_nodes = extract_node('''
  792. +1 #@
  793. -1 #@
  794. ~1 #@
  795. +2.0 #@
  796. -2.0 #@
  797. ''')
  798. expected = [1, -1, -2, 2.0, -2.0]
  799. for node, expected_value in zip(ast_nodes, expected):
  800. inferred = next(node.infer())
  801. self.assertEqual(inferred.value, expected_value)
  802. @test_utils.require_version(minver='3.5')
  803. def test_matmul(self):
  804. node = extract_node('''
  805. class Array:
  806. def __matmul__(self, other):
  807. return 42
  808. Array() @ Array() #@
  809. ''')
  810. inferred = next(node.infer())
  811. self.assertIsInstance(inferred, nodes.Const)
  812. self.assertEqual(inferred.value, 42)
  813. def test_binary_op_int_add(self):
  814. ast = builder.string_build('a = 1 + 2', __name__, __file__)
  815. self._test_const_inferred(ast['a'], 3)
  816. def test_binary_op_int_sub(self):
  817. ast = builder.string_build('a = 1 - 2', __name__, __file__)
  818. self._test_const_inferred(ast['a'], -1)
  819. def test_binary_op_float_div(self):
  820. ast = builder.string_build('a = 1 / 2.', __name__, __file__)
  821. self._test_const_inferred(ast['a'], 1 / 2.)
  822. def test_binary_op_str_mul(self):
  823. ast = builder.string_build('a = "*" * 40', __name__, __file__)
  824. self._test_const_inferred(ast['a'], "*" * 40)
  825. def test_binary_op_int_bitand(self):
  826. ast = builder.string_build('a = 23&20', __name__, __file__)
  827. self._test_const_inferred(ast['a'], 23&20)
  828. def test_binary_op_int_bitor(self):
  829. ast = builder.string_build('a = 23|8', __name__, __file__)
  830. self._test_const_inferred(ast['a'], 23|8)
  831. def test_binary_op_int_bitxor(self):
  832. ast = builder.string_build('a = 23^9', __name__, __file__)
  833. self._test_const_inferred(ast['a'], 23^9)
  834. def test_binary_op_int_shiftright(self):
  835. ast = builder.string_build('a = 23 >>1', __name__, __file__)
  836. self._test_const_inferred(ast['a'], 23>>1)
  837. def test_binary_op_int_shiftleft(self):
  838. ast = builder.string_build('a = 23 <<1', __name__, __file__)
  839. self._test_const_inferred(ast['a'], 23<<1)
  840. def test_binary_op_other_type(self):
  841. ast_nodes = extract_node('''
  842. class A:
  843. def __add__(self, other):
  844. return other + 42
  845. A() + 1 #@
  846. 1 + A() #@
  847. ''')
  848. first = next(ast_nodes[0].infer())
  849. self.assertIsInstance(first, nodes.Const)
  850. self.assertEqual(first.value, 43)
  851. second = next(ast_nodes[1].infer())
  852. self.assertEqual(second, util.Uninferable)
  853. def test_binary_op_other_type_using_reflected_operands(self):
  854. ast_nodes = extract_node('''
  855. class A(object):
  856. def __radd__(self, other):
  857. return other + 42
  858. A() + 1 #@
  859. 1 + A() #@
  860. ''')
  861. first = next(ast_nodes[0].infer())
  862. self.assertEqual(first, util.Uninferable)
  863. second = next(ast_nodes[1].infer())
  864. self.assertIsInstance(second, nodes.Const)
  865. self.assertEqual(second.value, 43)
  866. def test_binary_op_reflected_and_not_implemented_is_type_error(self):
  867. ast_node = extract_node('''
  868. class A(object):
  869. def __radd__(self, other): return NotImplemented
  870. 1 + A() #@
  871. ''')
  872. first = next(ast_node.infer())
  873. self.assertEqual(first, util.Uninferable)
  874. def test_binary_op_list_mul(self):
  875. for code in ('a = [[]] * 2', 'a = 2 * [[]]'):
  876. ast = builder.string_build(code, __name__, __file__)
  877. inferred = list(ast['a'].infer())
  878. self.assertEqual(len(inferred), 1)
  879. self.assertIsInstance(inferred[0], nodes.List)
  880. self.assertEqual(len(inferred[0].elts), 2)
  881. self.assertIsInstance(inferred[0].elts[0], nodes.List)
  882. self.assertIsInstance(inferred[0].elts[1], nodes.List)
  883. def test_binary_op_list_mul_none(self):
  884. 'test correct handling on list multiplied by None'
  885. ast = builder.string_build('a = [1] * None\nb = [1] * "r"')
  886. inferred = ast['a'].inferred()
  887. self.assertEqual(len(inferred), 1)
  888. self.assertEqual(inferred[0], util.Uninferable)
  889. inferred = ast['b'].inferred()
  890. self.assertEqual(len(inferred), 1)
  891. self.assertEqual(inferred[0], util.Uninferable)
  892. def test_binary_op_list_mul_int(self):
  893. 'test correct handling on list multiplied by int when there are more than one'
  894. code = '''
  895. from ctypes import c_int
  896. seq = [c_int()] * 4
  897. '''
  898. ast = parse(code, __name__)
  899. inferred = ast['seq'].inferred()
  900. self.assertEqual(len(inferred), 1)
  901. listval = inferred[0]
  902. self.assertIsInstance(listval, nodes.List)
  903. self.assertEqual(len(listval.itered()), 4)
  904. def test_binary_op_on_self(self):
  905. 'test correct handling of applying binary operator to self'
  906. code = '''
  907. import sys
  908. sys.path = ['foo'] + sys.path
  909. sys.path.insert(0, 'bar')
  910. path = sys.path
  911. '''
  912. ast = parse(code, __name__)
  913. inferred = ast['path'].inferred()
  914. self.assertIsInstance(inferred[0], nodes.List)
  915. def test_binary_op_tuple_add(self):
  916. ast = builder.string_build('a = (1,) + (2,)', __name__, __file__)
  917. inferred = list(ast['a'].infer())
  918. self.assertEqual(len(inferred), 1)
  919. self.assertIsInstance(inferred[0], nodes.Tuple)
  920. self.assertEqual(len(inferred[0].elts), 2)
  921. self.assertEqual(inferred[0].elts[0].value, 1)
  922. self.assertEqual(inferred[0].elts[1].value, 2)
  923. def test_binary_op_custom_class(self):
  924. code = '''
  925. class myarray:
  926. def __init__(self, array):
  927. self.array = array
  928. def __mul__(self, x):
  929. return myarray([2,4,6])
  930. def astype(self):
  931. return "ASTYPE"
  932. def randint(maximum):
  933. if maximum is not None:
  934. return myarray([1,2,3]) * 2
  935. else:
  936. return int(5)
  937. x = randint(1)
  938. '''
  939. ast = parse(code, __name__)
  940. inferred = list(ast.igetattr('x'))
  941. self.assertEqual(len(inferred), 2)
  942. value = [str(v) for v in inferred]
  943. # The __name__ trick here makes it work when invoked directly
  944. # (__name__ == '__main__') and through pytest (__name__ ==
  945. # 'unittest_inference')
  946. self.assertEqual(value, ['Instance of %s.myarray' % __name__,
  947. 'Instance of %s.int' % BUILTINS])
  948. def test_nonregr_lambda_arg(self):
  949. code = '''
  950. def f(g = lambda: None):
  951. __(g()).x
  952. '''
  953. callfuncnode = extract_node(code)
  954. inferred = list(callfuncnode.infer())
  955. self.assertEqual(len(inferred), 2, inferred)
  956. inferred.remove(util.Uninferable)
  957. self.assertIsInstance(inferred[0], nodes.Const)
  958. self.assertIsNone(inferred[0].value)
  959. def test_nonregr_getitem_empty_tuple(self):
  960. code = '''
  961. def f(x):
  962. a = ()[x]
  963. '''
  964. ast = parse(code, __name__)
  965. inferred = list(ast['f'].ilookup('a'))
  966. self.assertEqual(len(inferred), 1)
  967. self.assertEqual(inferred[0], util.Uninferable)
  968. def test_nonregr_instance_attrs(self):
  969. """non regression for instance_attrs infinite loop : pylint / #4"""
  970. code = """
  971. class Foo(object):
  972. def set_42(self):
  973. self.attr = 42
  974. class Bar(Foo):
  975. def __init__(self):
  976. self.attr = 41
  977. """
  978. ast = parse(code, __name__)
  979. foo_class = ast['Foo']
  980. bar_class = ast['Bar']
  981. bar_self = ast['Bar']['__init__']['self']
  982. assattr = bar_class.instance_attrs['attr'][0]
  983. self.assertEqual(len(foo_class.instance_attrs['attr']), 1)
  984. self.assertEqual(len(bar_class.instance_attrs['attr']), 1)
  985. self.assertEqual(bar_class.instance_attrs, {'attr': [assattr]})
  986. # call 'instance_attr' via 'Instance.getattr' to trigger the bug:
  987. instance = bar_self.inferred()[0]
  988. instance.getattr('attr')
  989. self.assertEqual(len(bar_class.instance_attrs['attr']), 1)
  990. self.assertEqual(len(foo_class.instance_attrs['attr']), 1)
  991. self.assertEqual(bar_class.instance_attrs, {'attr': [assattr]})
  992. def test_python25_no_relative_import(self):
  993. ast = resources.build_file('data/package/absimport.py')
  994. self.assertTrue(ast.absolute_import_activated(), True)
  995. inferred = next(test_utils.get_name_node(ast, 'import_package_subpackage_module').infer())
  996. # failed to import since absolute_import is activated
  997. self.assertIs(inferred, util.Uninferable)
  998. def test_nonregr_absolute_import(self):
  999. ast = resources.build_file('data/absimp/string.py', 'data.absimp.string')
  1000. self.assertTrue(ast.absolute_import_activated(), True)
  1001. inferred = next(test_utils.get_name_node(ast, 'string').infer())
  1002. self.assertIsInstance(inferred, nodes.Module)
  1003. self.assertEqual(inferred.name, 'string')
  1004. self.assertIn('ascii_letters', inferred.locals)
  1005. def test_mechanize_open(self):
  1006. try:
  1007. import mechanize # pylint: disable=unused-variable
  1008. except ImportError:
  1009. self.skipTest('require mechanize installed')
  1010. data = '''
  1011. from mechanize import Browser
  1012. print(Browser)
  1013. b = Browser()
  1014. '''
  1015. ast = parse(data, __name__)
  1016. browser = next(test_utils.get_name_node(ast, 'Browser').infer())
  1017. self.assertIsInstance(browser, nodes.ClassDef)
  1018. bopen = list(browser.igetattr('open'))
  1019. self.skipTest('the commit said: "huum, see that later"')
  1020. self.assertEqual(len(bopen), 1)
  1021. self.assertIsInstance(bopen[0], nodes.FunctionDef)
  1022. self.assertTrue(bopen[0].callable())
  1023. b = next(test_utils.get_name_node(ast, 'b').infer())
  1024. self.assertIsInstance(b, Instance)
  1025. bopen = list(b.igetattr('open'))
  1026. self.assertEqual(len(bopen), 1)
  1027. self.assertIsInstance(bopen[0], BoundMethod)
  1028. self.assertTrue(bopen[0].callable())
  1029. def test_property(self):
  1030. code = '''
  1031. from smtplib import SMTP
  1032. class SendMailController(object):
  1033. @property
  1034. def smtp(self):
  1035. return SMTP(mailhost, port)
  1036. @property
  1037. def me(self):
  1038. return self
  1039. my_smtp = SendMailController().smtp
  1040. my_me = SendMailController().me
  1041. '''
  1042. decorators = set(['%s.property' % BUILTINS])
  1043. ast = parse(code, __name__)
  1044. self.assertEqual(ast['SendMailController']['smtp'].decoratornames(),
  1045. decorators)
  1046. propinferred = list(ast.body[2].value.infer())
  1047. self.assertEqual(len(propinferred), 1)
  1048. propinferred = propinferred[0]
  1049. self.assertIsInstance(propinferred, Instance)
  1050. self.assertEqual(propinferred.name, 'SMTP')
  1051. self.assertEqual(propinferred.root().name, 'smtplib')
  1052. self.assertEqual(ast['SendMailController']['me'].decoratornames(),
  1053. decorators)
  1054. propinferred = list(ast.body[3].value.infer())
  1055. self.assertEqual(len(propinferred), 1)
  1056. propinferred = propinferred[0]
  1057. self.assertIsInstance(propinferred, Instance)
  1058. self.assertEqual(propinferred.name, 'SendMailController')
  1059. self.assertEqual(propinferred.root().name, __name__)
  1060. def test_im_func_unwrap(self):
  1061. code = '''
  1062. class EnvBasedTC:
  1063. def pactions(self):
  1064. pass
  1065. pactions = EnvBasedTC.pactions.im_func
  1066. print (pactions)
  1067. class EnvBasedTC2:
  1068. pactions = EnvBasedTC.pactions.im_func
  1069. print (pactions)
  1070. '''
  1071. ast = parse(code, __name__)
  1072. pactions = test_utils.get_name_node(ast, 'pactions')
  1073. inferred = list(pactions.infer())
  1074. self.assertEqual(len(inferred), 1)
  1075. self.assertIsInstance(inferred[0], nodes.FunctionDef)
  1076. pactions = test_utils.get_name_node(ast['EnvBasedTC2'], 'pactions')
  1077. inferred = list(pactions.infer())
  1078. self.assertEqual(len(inferred), 1)
  1079. self.assertIsInstance(inferred[0], nodes.FunctionDef)
  1080. def test_augassign(self):
  1081. code = '''
  1082. a = 1
  1083. a += 2
  1084. print (a)
  1085. '''
  1086. ast = parse(code, __name__)
  1087. inferred = list(test_utils.get_name_node(ast, 'a').infer())
  1088. self.assertEqual(len(inferred), 1)
  1089. self.assertIsInstance(inferred[0], nodes.Const)
  1090. self.assertEqual(inferred[0].value, 3)
  1091. def test_nonregr_func_arg(self):
  1092. code = '''
  1093. def foo(self, bar):
  1094. def baz():
  1095. pass
  1096. def qux():
  1097. return baz
  1098. spam = bar(None, qux)
  1099. print (spam)
  1100. '''
  1101. ast = parse(code, __name__)
  1102. inferred = list(test_utils.get_name_node(ast['foo'], 'spam').infer())
  1103. self.assertEqual(len(inferred), 1)
  1104. self.assertIs(inferred[0], util.Uninferable)
  1105. def test_nonregr_func_global(self):
  1106. code = '''
  1107. active_application = None
  1108. def get_active_application():
  1109. global active_application
  1110. return active_application
  1111. class Application(object):
  1112. def __init__(self):
  1113. global active_application
  1114. active_application = self
  1115. class DataManager(object):
  1116. def __init__(self, app=None):
  1117. self.app = get_active_application()
  1118. def test(self):
  1119. p = self.app
  1120. print (p)
  1121. '''
  1122. ast = parse(code, __name__)
  1123. inferred = list(Instance(ast['DataManager']).igetattr('app'))
  1124. self.assertEqual(len(inferred), 2, inferred) # None / Instance(Application)
  1125. inferred = list(test_utils.get_name_node(ast['DataManager']['test'], 'p').infer())
  1126. self.assertEqual(len(inferred), 2, inferred)
  1127. for node in inferred:
  1128. if isinstance(node, Instance) and node.name == 'Application':
  1129. break
  1130. else:
  1131. self.fail('expected to find an instance of Application in %s' % inferred)
  1132. def test_list_inference(self):
  1133. """#20464"""
  1134. code = '''
  1135. from unknown import Unknown
  1136. A = []
  1137. B = []
  1138. def test():
  1139. xyz = [
  1140. Unknown
  1141. ] + A + B
  1142. return xyz
  1143. Z = test()
  1144. '''
  1145. ast = parse(code, __name__)
  1146. inferred = next(ast['Z'].infer())
  1147. self.assertIsInstance(inferred, nodes.List)
  1148. self.assertEqual(len(inferred.elts), 1)
  1149. self.assertIsInstance(inferred.elts[0], nodes.Unknown)
  1150. def test__new__(self):
  1151. code = '''
  1152. class NewTest(object):
  1153. "doc"
  1154. def __new__(cls, arg):
  1155. self = object.__new__(cls)
  1156. self.arg = arg
  1157. return self
  1158. n = NewTest()
  1159. '''
  1160. ast = parse(code, __name__)
  1161. self.assertRaises(InferenceError, list, ast['NewTest'].igetattr('arg'))
  1162. n = next(ast['n'].infer())
  1163. inferred = list(n.igetattr('arg'))
  1164. self.assertEqual(len(inferred), 1, inferred)
  1165. def test__new__bound_methods(self):
  1166. node = extract_node('''
  1167. class cls(object): pass
  1168. cls().__new__(cls) #@
  1169. ''')
  1170. inferred = next(node.infer())
  1171. self.assertIsInstance(inferred, Instance)
  1172. self.assertEqual(inferred._proxied, node.root()['cls'])
  1173. def test_two_parents_from_same_module(self):
  1174. code = '''
  1175. from data import nonregr
  1176. class Xxx(nonregr.Aaa, nonregr.Ccc):
  1177. "doc"
  1178. '''
  1179. ast = parse(code, __name__)
  1180. parents = list(ast['Xxx'].ancestors())
  1181. self.assertEqual(len(parents), 3, parents) # Aaa, Ccc, object
  1182. def test_pluggable_inference(self):
  1183. code = '''
  1184. from collections import namedtuple
  1185. A = namedtuple('A', ['a', 'b'])
  1186. B = namedtuple('B', 'a b')
  1187. '''
  1188. ast = parse(code, __name__)
  1189. aclass = ast['A'].inferred()[0]
  1190. self.assertIsInstance(aclass, nodes.ClassDef)
  1191. self.assertIn('a', aclass.instance_attrs)
  1192. self.assertIn('b', aclass.instance_attrs)
  1193. bclass = ast['B'].inferred()[0]
  1194. self.assertIsInstance(bclass, nodes.ClassDef)
  1195. self.assertIn('a', bclass.instance_attrs)
  1196. self.assertIn('b', bclass.instance_attrs)
  1197. def test_infer_arguments(self):
  1198. code = '''
  1199. class A(object):
  1200. def first(self, arg1, arg2):
  1201. return arg1
  1202. @classmethod
  1203. def method(cls, arg1, arg2):
  1204. return arg2
  1205. @classmethod
  1206. def empty(cls):
  1207. return 2
  1208. @staticmethod
  1209. def static(arg1, arg2):
  1210. return arg1
  1211. def empty_method(self):
  1212. return []
  1213. x = A().first(1, [])
  1214. y = A.method(1, [])
  1215. z = A.static(1, [])
  1216. empty = A.empty()
  1217. empty_list = A().empty_method()
  1218. '''
  1219. ast = parse(code, __name__)
  1220. int_node = ast['x'].inferred()[0]
  1221. self.assertIsInstance(int_node, nodes.Const)
  1222. self.assertEqual(int_node.value, 1)
  1223. list_node = ast['y'].inferred()[0]
  1224. self.assertIsInstance(list_node, nodes.List)
  1225. int_node = ast['z'].inferred()[0]
  1226. self.assertIsInstance(int_node, nodes.Const)
  1227. self.assertEqual(int_node.value, 1)
  1228. empty = ast['empty'].inferred()[0]
  1229. self.assertIsInstance(empty, nodes.Const)
  1230. self.assertEqual(empty.value, 2)
  1231. empty_list = ast['empty_list'].inferred()[0]
  1232. self.assertIsInstance(empty_list, nodes.List)
  1233. def test_infer_variable_arguments(self):
  1234. code = '''
  1235. def test(*args, **kwargs):
  1236. vararg = args
  1237. kwarg = kwargs
  1238. '''
  1239. ast = parse(code, __name__)
  1240. func = ast['test']
  1241. vararg = func.body[0].value
  1242. kwarg = func.body[1].value
  1243. kwarg_inferred = kwarg.inferred()[0]
  1244. self.assertIsInstance(kwarg_inferred, nodes.Dict)
  1245. self.assertIs(kwarg_inferred.parent, func.args)
  1246. vararg_inferred = vararg.inferred()[0]
  1247. self.assertIsInstance(vararg_inferred, nodes.Tuple)
  1248. self.assertIs(vararg_inferred.parent, func.args)
  1249. def test_infer_nested(self):
  1250. code = """
  1251. def nested():
  1252. from threading import Thread
  1253. class NestedThread(Thread):
  1254. def __init__(self):
  1255. Thread.__init__(self)
  1256. """
  1257. # Test that inferring Thread.__init__ looks up in
  1258. # the nested scope.
  1259. ast = parse(code, __name__)
  1260. callfunc = next(ast.nodes_of_class(nodes.Call))
  1261. func = callfunc.func
  1262. inferred = func.inferred()[0]
  1263. self.assertIsInstance(inferred, UnboundMethod)
  1264. def test_instance_binary_operations(self):
  1265. code = """
  1266. class A(object):
  1267. def __mul__(self, other):
  1268. return 42
  1269. a = A()
  1270. b = A()
  1271. sub = a - b
  1272. mul = a * b
  1273. """
  1274. ast = parse(code, __name__)
  1275. sub = ast['sub'].inferred()[0]
  1276. mul = ast['mul'].inferred()[0]
  1277. self.assertIs(sub, util.Uninferable)
  1278. self.assertIsInstance(mul, nodes.Const)
  1279. self.assertEqual(mul.value, 42)
  1280. def test_instance_binary_operations_parent(self):
  1281. code = """
  1282. class A(object):
  1283. def __mul__(self, other):
  1284. return 42
  1285. class B(A):
  1286. pass
  1287. a = B()
  1288. b = B()
  1289. sub = a - b
  1290. mul = a * b
  1291. """
  1292. ast = parse(code, __name__)
  1293. sub = ast['sub'].inferred()[0]
  1294. mul = ast['mul'].inferred()[0]
  1295. self.assertIs(sub, util. Uninferable)
  1296. self.assertIsInstance(mul, nodes.Const)
  1297. self.assertEqual(mul.value, 42)
  1298. def test_instance_binary_operations_multiple_methods(self):
  1299. code = """
  1300. class A(object):
  1301. def __mul__(self, other):
  1302. return 42
  1303. class B(A):
  1304. def __mul__(self, other):
  1305. return [42]
  1306. a = B()
  1307. b = B()
  1308. sub = a - b
  1309. mul = a * b
  1310. """
  1311. ast = parse(code, __name__)
  1312. sub = ast['sub'].inferred()[0]
  1313. mul = ast['mul'].inferred()[0]
  1314. self.assertIs(sub, util.Uninferable)
  1315. self.assertIsInstance(mul, nodes.List)
  1316. self.assertIsInstance(mul.elts[0], nodes.Const)
  1317. self.assertEqual(mul.elts[0].value, 42)
  1318. def test_infer_call_result_crash(self):
  1319. code = """
  1320. class A(object):
  1321. def __mul__(self, other):
  1322. return type.__new__()
  1323. a = A()
  1324. b = A()
  1325. c = a * b
  1326. """
  1327. ast = parse(code, __name__)
  1328. node = ast['c']
  1329. self.assertEqual(node.inferred(), [util.Uninferable])
  1330. def test_infer_empty_nodes(self):
  1331. # Should not crash when trying to infer EmptyNodes.
  1332. node = nodes.EmptyNode()
  1333. self.assertEqual(node.inferred(), [util.Uninferable])
  1334. def test_infinite_loop_for_decorators(self):
  1335. # Issue https://bitbucket.org/logilab/astroid/issue/50
  1336. # A decorator that returns itself leads to an infinite loop.
  1337. code = """
  1338. def decorator():
  1339. def wrapper():
  1340. return decorator()
  1341. return wrapper
  1342. @decorator()
  1343. def do_a_thing():
  1344. pass
  1345. """
  1346. ast = parse(code, __name__)
  1347. node = ast['do_a_thing']
  1348. self.assertEqual(node.type, 'function')
  1349. def test_no_infinite_ancestor_loop(self):
  1350. klass = extract_node("""
  1351. import datetime
  1352. def method(self):
  1353. datetime.datetime = something()
  1354. class something(datetime.datetime): #@
  1355. pass
  1356. """)
  1357. self.assertIn(
  1358. 'object',
  1359. [base.name for base in klass.ancestors()])
  1360. def test_stop_iteration_leak(self):
  1361. code = """
  1362. class Test:
  1363. def __init__(self):
  1364. self.config = {0: self.config[0]}
  1365. self.config[0].test() #@
  1366. """
  1367. ast = extract_node(code, __name__)
  1368. expr = ast.func.expr
  1369. self.assertRaises(InferenceError, next, expr.infer())
  1370. def test_tuple_builtin_inference(self):
  1371. code = """
  1372. var = (1, 2)
  1373. tuple() #@
  1374. tuple([1]) #@
  1375. tuple({2}) #@
  1376. tuple("abc") #@
  1377. tuple({1: 2}) #@
  1378. tuple(var) #@
  1379. tuple(tuple([1])) #@
  1380. tuple(frozenset((1, 2))) #@
  1381. tuple(None) #@
  1382. tuple(1) #@
  1383. tuple(1, 2) #@
  1384. """
  1385. ast = extract_node(code, __name__)
  1386. self.assertInferTuple(ast[0], [])
  1387. self.assertInferTuple(ast[1], [1])
  1388. self.assertInferTuple(ast[2], [2])
  1389. self.assertInferTuple(ast[3], ["a", "b", "c"])
  1390. self.assertInferTuple(ast[4], [1])
  1391. self.assertInferTuple(ast[5], [1, 2])
  1392. self.assertInferTuple(ast[6], [1])
  1393. self.assertInferTuple(ast[7], [1, 2])
  1394. for node in ast[8:]:
  1395. inferred = next(node.infer())
  1396. self.assertIsInstance(inferred, Instance)
  1397. self.assertEqual(inferred.qname(), "{}.tuple".format(BUILTINS))
  1398. @test_utils.require_version('3.5')
  1399. def test_starred_in_tuple_literal(self):
  1400. code = """
  1401. var = (1, 2, 3)
  1402. bar = (5, 6, 7)
  1403. foo = [999, 1000, 1001]
  1404. (0, *var) #@
  1405. (0, *var, 4) #@
  1406. (0, *var, 4, *bar) #@
  1407. (0, *var, 4, *(*bar, 8)) #@
  1408. (0, *var, 4, *(*bar, *foo)) #@
  1409. """
  1410. ast = extract_node(code, __name__)
  1411. self.assertInferTuple(ast[0], [0, 1, 2, 3])
  1412. self.assertInferTuple(ast[1], [0, 1, 2, 3, 4])
  1413. self.assertInferTuple(ast[2], [0, 1, 2, 3, 4, 5, 6, 7])
  1414. self.assertInferTuple(ast[3], [0, 1, 2, 3, 4, 5, 6, 7, 8])
  1415. self.assertInferTuple(ast[4], [0, 1, 2, 3, 4, 5, 6, 7, 999, 1000, 1001])
  1416. @test_utils.require_version('3.5')
  1417. def test_starred_in_list_literal(self):
  1418. code = """
  1419. var = (1, 2, 3)
  1420. bar = (5, 6, 7)
  1421. foo = [999, 1000, 1001]
  1422. [0, *var] #@
  1423. [0, *var, 4] #@
  1424. [0, *var, 4, *bar] #@
  1425. [0, *var, 4, *[*bar, 8]] #@
  1426. [0, *var, 4, *[*bar, *foo]] #@
  1427. """
  1428. ast = extract_node(code, __name__)
  1429. self.assertInferList(ast[0], [0, 1, 2, 3])
  1430. self.assertInferList(ast[1], [0, 1, 2, 3, 4])
  1431. self.assertInferList(ast[2], [0, 1, 2, 3, 4, 5, 6, 7])
  1432. self.assertInferList(ast[3], [0, 1, 2, 3, 4, 5, 6, 7, 8])
  1433. self.assertInferList(ast[4], [0, 1, 2, 3, 4, 5, 6, 7, 999, 1000, 1001])
  1434. @test_utils.require_version('3.5')
  1435. def test_starred_in_set_literal(self):
  1436. code = """
  1437. var = (1, 2, 3)
  1438. bar = (5, 6, 7)
  1439. foo = [999, 1000, 1001]
  1440. {0, *var} #@
  1441. {0, *var, 4} #@
  1442. {0, *var, 4, *bar} #@
  1443. {0, *var, 4, *{*bar, 8}} #@
  1444. {0, *var, 4, *{*bar, *foo}} #@
  1445. """
  1446. ast = extract_node(code, __name__)
  1447. self.assertInferSet(ast[0], [0, 1, 2, 3])
  1448. self.assertInferSet(ast[1], [0, 1, 2, 3, 4])
  1449. self.assertInferSet(ast[2], [0, 1, 2, 3, 4, 5, 6, 7])
  1450. self.assertInferSet(ast[3], [0, 1, 2, 3, 4, 5, 6, 7, 8])
  1451. self.assertInferSet(ast[4], [0, 1, 2, 3, 4, 5, 6, 7, 999, 1000, 1001])
  1452. @test_utils.require_version('3.5')
  1453. def test_starred_in_literals_inference_issues(self):
  1454. code = """
  1455. {0, *var} #@
  1456. {0, *var, 4} #@
  1457. {0, *var, 4, *bar} #@
  1458. {0, *var, 4, *{*bar, 8}} #@
  1459. {0, *var, 4, *{*bar, *foo}} #@
  1460. """
  1461. ast = extract_node(code, __name__)
  1462. for node in ast:
  1463. with self.assertRaises(InferenceError):
  1464. next(node.infer())
  1465. @test_utils.require_version('3.5')
  1466. def test_starred_in_mapping_literal(self):
  1467. code = """
  1468. var = {1: 'b', 2: 'c'}
  1469. bar = {4: 'e', 5: 'f'}
  1470. {0: 'a', **var} #@
  1471. {0: 'a', **var, 3: 'd'} #@
  1472. {0: 'a', **var, 3: 'd', **{**bar, 6: 'g'}} #@
  1473. """
  1474. ast = extract_node(code, __name__)
  1475. self.assertInferDict(ast[0], {0: 'a', 1: 'b', 2: 'c'})
  1476. self.assertInferDict(ast[1], {0: 'a', 1: 'b', 2: 'c', 3: 'd'})
  1477. self.assertInferDict(ast[2], {0: 'a', 1: 'b', 2: 'c', 3: 'd',
  1478. 4: 'e', 5: 'f', 6: 'g'})
  1479. @test_utils.require_version('3.5')
  1480. def test_starred_in_mapping_literal_no_inference_possible(self):
  1481. node = extract_node('''
  1482. from unknown import unknown
  1483. def test(a):
  1484. return a + 1
  1485. def func():
  1486. a = {unknown: 'a'}
  1487. return {0: 1, **a}
  1488. test(**func())
  1489. ''')
  1490. self.assertEqual(next(node.infer()), util.Uninferable)
  1491. @test_utils.require_version('3.5')
  1492. def test_starred_in_mapping_inference_issues(self):
  1493. code = """
  1494. {0: 'a', **var} #@
  1495. {0: 'a', **var, 3: 'd'} #@
  1496. {0: 'a', **var, 3: 'd', **{**bar, 6: 'g'}} #@
  1497. """
  1498. ast = extract_node(code, __name__)
  1499. for node in ast:
  1500. with self.assertRaises(InferenceError):
  1501. next(node.infer())
  1502. @test_utils.require_version('3.5')
  1503. def test_starred_in_mapping_literal_non_const_keys_values(self):
  1504. code = """
  1505. a, b, c, d, e, f, g, h, i, j = "ABCDEFGHIJ"
  1506. var = {c: d, e: f}
  1507. bar = {i: j}
  1508. {a: b, **var} #@
  1509. {a: b, **var, **{g: h, **bar}} #@
  1510. """
  1511. ast = extract_node(code, __name__)
  1512. self.assertInferDict(ast[0], {"A": "B", "C": "D", "E": "F"})
  1513. self.assertInferDict(ast[1], {"A": "B", "C": "D", "E": "F", "G": "H", "I": "J"})
  1514. def test_frozenset_builtin_inference(self):
  1515. code = """
  1516. var = (1, 2)
  1517. frozenset() #@
  1518. frozenset([1, 2, 1]) #@
  1519. frozenset({2, 3, 1}) #@
  1520. frozenset("abcab") #@
  1521. frozenset({1: 2}) #@
  1522. frozenset(var) #@
  1523. frozenset(tuple([1])) #@
  1524. frozenset(set(tuple([4, 5, set([2])]))) #@
  1525. frozenset(None) #@
  1526. frozenset(1) #@
  1527. frozenset(1, 2) #@
  1528. """
  1529. ast = extract_node(code, __name__)
  1530. self.assertInferFrozenSet(ast[0], [])
  1531. self.assertInferFrozenSet(ast[1], [1, 2])
  1532. self.assertInferFrozenSet(ast[2], [1, 2, 3])
  1533. self.assertInferFrozenSet(ast[3], ["a", "b", "c"])
  1534. self.assertInferFrozenSet(ast[4], [1])
  1535. self.assertInferFrozenSet(ast[5], [1, 2])
  1536. self.assertInferFrozenSet(ast[6], [1])
  1537. for node in ast[7:]:
  1538. inferred = next(node.infer())
  1539. self.assertIsInstance(inferred, Instance)
  1540. self.assertEqual(inferred.qname(), "{}.frozenset".format(BUILTINS))
  1541. def test_set_builtin_inference(self):
  1542. code = """
  1543. var = (1, 2)
  1544. set() #@
  1545. set([1, 2, 1]) #@
  1546. set({2, 3, 1}) #@
  1547. set("abcab") #@
  1548. set({1: 2}) #@
  1549. set(var) #@
  1550. set(tuple([1])) #@
  1551. set(set(tuple([4, 5, set([2])]))) #@
  1552. set(None) #@
  1553. set(1) #@
  1554. set(1, 2) #@
  1555. """
  1556. ast = extract_node(code, __name__)
  1557. self.assertInferSet(ast[0], [])
  1558. self.assertInferSet(ast[1], [1, 2])
  1559. self.assertInferSet(ast[2], [1, 2, 3])
  1560. self.assertInferSet(ast[3], ["a", "b", "c"])
  1561. self.assertInferSet(ast[4], [1])
  1562. self.assertInferSet(ast[5], [1, 2])
  1563. self.assertInferSet(ast[6], [1])
  1564. for node in ast[7:]:
  1565. inferred = next(node.infer())
  1566. self.assertIsInstance(inferred, Instance)
  1567. self.assertEqual(inferred.qname(), "{}.set".format(BUILTINS))
  1568. def test_list_builtin_inference(self):
  1569. code = """
  1570. var = (1, 2)
  1571. list() #@
  1572. list([1, 2, 1]) #@
  1573. list({2, 3, 1}) #@
  1574. list("abcab") #@
  1575. list({1: 2}) #@
  1576. list(var) #@
  1577. list(tuple([1])) #@
  1578. list(list(tuple([4, 5, list([2])]))) #@
  1579. list(None) #@
  1580. list(1) #@
  1581. list(1, 2) #@
  1582. """
  1583. ast = extract_node(code, __name__)
  1584. self.assertInferList(ast[0], [])
  1585. self.assertInferList(ast[1], [1, 1, 2])
  1586. self.assertInferList(ast[2], [1, 2, 3])
  1587. self.assertInferList(ast[3], ["a", "a", "b", "b", "c"])
  1588. self.assertInferList(ast[4], [1])
  1589. self.assertInferList(ast[5], [1, 2])
  1590. self.assertInferList(ast[6], [1])
  1591. for node in ast[7:]:
  1592. inferred = next(node.infer())
  1593. self.assertIsInstance(inferred, Instance)
  1594. self.assertEqual(inferred.qname(), "{}.list".format(BUILTINS))
  1595. def test_conversion_of_dict_methods(self):
  1596. ast_nodes = extract_node('''
  1597. list({1:2, 2:3}.values()) #@
  1598. list({1:2, 2:3}.keys()) #@
  1599. tuple({1:2, 2:3}.values()) #@
  1600. tuple({1:2, 3:4}.keys()) #@
  1601. set({1:2, 2:4}.keys()) #@
  1602. ''')
  1603. self.assertInferList(ast_nodes[0], [2, 3])
  1604. self.assertInferList(ast_nodes[1], [1, 2])
  1605. self.assertInferTuple(ast_nodes[2], [2, 3])
  1606. self.assertInferTuple(ast_nodes[3], [1, 3])
  1607. self.assertInferSet(ast_nodes[4], [1, 2])
  1608. @test_utils.require_version('3.0')
  1609. def test_builtin_inference_py3k(self):
  1610. code = """
  1611. list(b"abc") #@
  1612. tuple(b"abc") #@
  1613. set(b"abc") #@
  1614. """
  1615. ast = extract_node(code, __name__)
  1616. self.assertInferList(ast[0], [97, 98, 99])
  1617. self.assertInferTuple(ast[1], [97, 98, 99])
  1618. self.assertInferSet(ast[2], [97, 98, 99])
  1619. def test_dict_inference(self):
  1620. code = """
  1621. dict() #@
  1622. dict(a=1, b=2, c=3) #@
  1623. dict([(1, 2), (2, 3)]) #@
  1624. dict([[1, 2], [2, 3]]) #@
  1625. dict([(1, 2), [2, 3]]) #@
  1626. dict([('a', 2)], b=2, c=3) #@
  1627. dict({1: 2}) #@
  1628. dict({'c': 2}, a=4, b=5) #@
  1629. def func():
  1630. return dict(a=1, b=2)
  1631. func() #@
  1632. var = {'x': 2, 'y': 3}
  1633. dict(var, a=1, b=2) #@
  1634. dict([1, 2, 3]) #@
  1635. dict([(1, 2), (1, 2, 3)]) #@
  1636. dict({1: 2}, {1: 2}) #@
  1637. dict({1: 2}, (1, 2)) #@
  1638. dict({1: 2}, (1, 2), a=4) #@
  1639. dict([(1, 2), ([4, 5], 2)]) #@
  1640. dict([None, None]) #@
  1641. def using_unknown_kwargs(**kwargs):
  1642. return dict(**kwargs)
  1643. using_unknown_kwargs(a=1, b=2) #@
  1644. """
  1645. ast = extract_node(code, __name__)
  1646. self.assertInferDict(ast[0], {})
  1647. self.assertInferDict(ast[1], {'a': 1, 'b': 2, 'c': 3})
  1648. for i in range(2, 5):
  1649. self.assertInferDict(ast[i], {1: 2, 2: 3})
  1650. self.assertInferDict(ast[5], {'a': 2, 'b': 2, 'c': 3})
  1651. self.assertInferDict(ast[6], {1: 2})
  1652. self.assertInferDict(ast[7], {'c': 2, 'a': 4, 'b': 5})
  1653. self.assertInferDict(ast[8], {'a': 1, 'b': 2})
  1654. self.assertInferDict(ast[9], {'x': 2, 'y': 3, 'a': 1, 'b': 2})
  1655. for node in ast[10:]:
  1656. inferred = next(node.infer())
  1657. self.assertIsInstance(inferred, Instance)
  1658. self.assertEqual(inferred.qname(), "{}.dict".format(BUILTINS))
  1659. def test_dict_inference_kwargs(self):
  1660. ast_node = extract_node('''dict(a=1, b=2, **{'c': 3})''')
  1661. self.assertInferDict(ast_node, {'a': 1, 'b': 2, 'c': 3})
  1662. @test_utils.require_version('3.5')
  1663. def test_dict_inference_for_multiple_starred(self):
  1664. pairs = [
  1665. ('dict(a=1, **{"b": 2}, **{"c":3})', {'a':1, 'b':2, 'c':3}),
  1666. ('dict(a=1, **{"b": 2}, d=4, **{"c":3})', {'a':1, 'b':2, 'c':3, 'd':4}),
  1667. ('dict({"a":1}, b=2, **{"c":3})', {'a':1, 'b':2, 'c':3}),
  1668. ]
  1669. for code, expected_value in pairs:
  1670. node = extract_node(code)
  1671. self.assertInferDict(node, expected_value)
  1672. def test_dict_invalid_args(self):
  1673. invalid_values = [
  1674. 'dict(*1)',
  1675. 'dict(**lala)',
  1676. 'dict(**[])',
  1677. ]
  1678. for invalid in invalid_values:
  1679. ast_node = extract_node(invalid)
  1680. inferred = next(ast_node.infer())
  1681. self.assertIsInstance(inferred, Instance)
  1682. self.assertEqual(inferred.qname(), "{}.dict".format(BUILTINS))
  1683. def test_str_methods(self):
  1684. code = """
  1685. ' '.decode() #@
  1686. ' '.encode() #@
  1687. ' '.join('abcd') #@
  1688. ' '.replace('a', 'b') #@
  1689. ' '.format('a') #@
  1690. ' '.capitalize() #@
  1691. ' '.title() #@
  1692. ' '.lower() #@
  1693. ' '.upper() #@
  1694. ' '.swapcase() #@
  1695. ' '.strip() #@
  1696. ' '.rstrip() #@
  1697. ' '.lstrip() #@
  1698. ' '.rjust() #@
  1699. ' '.ljust() #@
  1700. ' '.center() #@
  1701. ' '.index() #@
  1702. ' '.find() #@
  1703. ' '.count() #@
  1704. """
  1705. ast = extract_node(code, __name__)
  1706. self.assertInferConst(ast[0], u'')
  1707. for i in range(1, 16):
  1708. self.assertInferConst(ast[i], '')
  1709. for i in range(16, 19):
  1710. self.assertInferConst(ast[i], 0)
  1711. def test_unicode_methods(self):
  1712. code = """
  1713. u' '.encode() #@
  1714. u' '.decode() #@
  1715. u' '.join('abcd') #@
  1716. u' '.replace('a', 'b') #@
  1717. u' '.format('a') #@
  1718. u' '.capitalize() #@
  1719. u' '.title() #@
  1720. u' '.lower() #@
  1721. u' '.upper() #@
  1722. u' '.swapcase() #@
  1723. u' '.strip() #@
  1724. u' '.rstrip() #@
  1725. u' '.lstrip() #@
  1726. u' '.rjust() #@
  1727. u' '.ljust() #@
  1728. u' '.center() #@
  1729. u' '.index() #@
  1730. u' '.find() #@
  1731. u' '.count() #@
  1732. """
  1733. ast = extract_node(code, __name__)
  1734. self.assertInferConst(ast[0], '')
  1735. for i in range(1, 16):
  1736. self.assertInferConst(ast[i], u'')
  1737. for i in range(16, 19):
  1738. self.assertInferConst(ast[i], 0)
  1739. def test_scope_lookup_same_attributes(self):
  1740. code = '''
  1741. import collections
  1742. class Second(collections.Counter):
  1743. def collections(self):
  1744. return "second"
  1745. '''
  1746. ast = parse(code, __name__)
  1747. bases = ast['Second'].bases[0]
  1748. inferred = next(bases.infer())
  1749. self.assertTrue(inferred)
  1750. self.assertIsInstance(inferred, nodes.ClassDef)
  1751. self.assertEqual(inferred.qname(), 'collections.Counter')
  1752. def test_inferring_with_statement_failures(self):
  1753. module = parse('''
  1754. class NoEnter(object):
  1755. pass
  1756. class NoMethod(object):
  1757. __enter__ = None
  1758. class NoElts(object):
  1759. def __enter__(self):
  1760. return 42
  1761. with NoEnter() as no_enter:
  1762. pass
  1763. with NoMethod() as no_method:
  1764. pass
  1765. with NoElts() as (no_elts, no_elts1):
  1766. pass
  1767. ''')
  1768. self.assertRaises(InferenceError, next, module['no_enter'].infer())
  1769. self.assertRaises(InferenceError, next, module['no_method'].infer())
  1770. self.assertRaises(InferenceError, next, module['no_elts'].infer())
  1771. def test_inferring_with_statement(self):
  1772. module = parse('''
  1773. class SelfContext(object):
  1774. def __enter__(self):
  1775. return self
  1776. class OtherContext(object):
  1777. def __enter__(self):
  1778. return SelfContext()
  1779. class MultipleReturns(object):
  1780. def __enter__(self):
  1781. return SelfContext(), OtherContext()
  1782. class MultipleReturns2(object):
  1783. def __enter__(self):
  1784. return [1, [2, 3]]
  1785. with SelfContext() as self_context:
  1786. pass
  1787. with OtherContext() as other_context:
  1788. pass
  1789. with MultipleReturns(), OtherContext() as multiple_with:
  1790. pass
  1791. with MultipleReturns2() as (stdout, (stderr, stdin)):
  1792. pass
  1793. ''')
  1794. self_context = module['self_context']
  1795. inferred = next(self_context.infer())
  1796. self.assertIsInstance(inferred, Instance)
  1797. self.assertEqual(inferred.name, 'SelfContext')
  1798. other_context = module['other_context']
  1799. inferred = next(other_context.infer())
  1800. self.assertIsInstance(inferred, Instance)
  1801. self.assertEqual(inferred.name, 'SelfContext')
  1802. multiple_with = module['multiple_with']
  1803. inferred = next(multiple_with.infer())
  1804. self.assertIsInstance(inferred, Instance)
  1805. self.assertEqual(inferred.name, 'SelfContext')
  1806. stdout = module['stdout']
  1807. inferred = next(stdout.infer())
  1808. self.assertIsInstance(inferred, nodes.Const)
  1809. self.assertEqual(inferred.value, 1)
  1810. stderr = module['stderr']
  1811. inferred = next(stderr.infer())
  1812. self.assertIsInstance(inferred, nodes.Const)
  1813. self.assertEqual(inferred.value, 2)
  1814. def test_inferring_with_contextlib_contextmanager(self):
  1815. module = parse('''
  1816. import contextlib
  1817. from contextlib import contextmanager
  1818. @contextlib.contextmanager
  1819. def manager_none():
  1820. try:
  1821. yield
  1822. finally:
  1823. pass
  1824. @contextlib.contextmanager
  1825. def manager_something():
  1826. try:
  1827. yield 42
  1828. yield 24 # This should be ignored.
  1829. finally:
  1830. pass
  1831. @contextmanager
  1832. def manager_multiple():
  1833. with manager_none() as foo:
  1834. with manager_something() as bar:
  1835. yield foo, bar
  1836. with manager_none() as none:
  1837. pass
  1838. with manager_something() as something:
  1839. pass
  1840. with manager_multiple() as (first, second):
  1841. pass
  1842. ''')
  1843. none = module['none']
  1844. inferred = next(none.infer())
  1845. self.assertIsInstance(inferred, nodes.Const)
  1846. self.assertIsNone(inferred.value)
  1847. something = module['something']
  1848. inferred = something.inferred()
  1849. self.assertEqual(len(inferred), 1)
  1850. inferred = inferred[0]
  1851. self.assertIsInstance(inferred, nodes.Const)
  1852. self.assertEqual(inferred.value, 42)
  1853. first, second = module['first'], module['second']
  1854. first = next(first.infer())
  1855. second = next(second.infer())
  1856. self.assertIsInstance(first, nodes.Const)
  1857. self.assertIsNone(first.value)
  1858. self.assertIsInstance(second, nodes.Const)
  1859. self.assertEqual(second.value, 42)
  1860. def test_inferring_context_manager_skip_index_error(self):
  1861. # Raise an InferenceError when having multiple 'as' bindings
  1862. # from a context manager, but its result doesn't have those
  1863. # indices. This is the case of contextlib.nested, where the
  1864. # result is a list, which is mutated later on, so it's
  1865. # undetected by astroid.
  1866. module = parse('''
  1867. class Manager(object):
  1868. def __enter__(self):
  1869. return []
  1870. with Manager() as (a, b, c):
  1871. pass
  1872. ''')
  1873. self.assertRaises(InferenceError, next, module['a'].infer())
  1874. def test_inferring_context_manager_unpacking_inference_error(self):
  1875. # https://github.com/PyCQA/pylint/issues/1463
  1876. module = parse('''
  1877. import contextlib
  1878. @contextlib.contextmanager
  1879. def _select_source(a=None):
  1880. with _select_source() as result:
  1881. yield result
  1882. result = _select_source()
  1883. with result as (a, b, c):
  1884. pass
  1885. ''')
  1886. self.assertRaises(InferenceError, next, module['a'].infer())
  1887. def test_inferring_with_contextlib_contextmanager_failures(self):
  1888. module = parse('''
  1889. from contextlib import contextmanager
  1890. def no_decorators_mgr():
  1891. yield
  1892. @no_decorators_mgr
  1893. def other_decorators_mgr():
  1894. yield
  1895. @contextmanager
  1896. def no_yield_mgr():
  1897. pass
  1898. with no_decorators_mgr() as no_decorators:
  1899. pass
  1900. with other_decorators_mgr() as other_decorators:
  1901. pass
  1902. with no_yield_mgr() as no_yield:
  1903. pass
  1904. ''')
  1905. self.assertRaises(InferenceError, next, module['no_decorators'].infer())
  1906. self.assertRaises(InferenceError, next, module['other_decorators'].infer())
  1907. self.assertRaises(InferenceError, next, module['no_yield'].infer())
  1908. def test_nested_contextmanager(self):
  1909. """Make sure contextmanager works with nested functions
  1910. Previously contextmanager would retrieve
  1911. the first yield instead of the yield in the
  1912. proper scope
  1913. Fixes https://github.com/PyCQA/pylint/issues/1746
  1914. """
  1915. code = """
  1916. from contextlib import contextmanager
  1917. @contextmanager
  1918. def outer():
  1919. @contextmanager
  1920. def inner():
  1921. yield 2
  1922. yield inner
  1923. with outer() as ctx:
  1924. ctx #@
  1925. with ctx() as val:
  1926. val #@
  1927. """
  1928. context_node, value_node = extract_node(code)
  1929. value = next(value_node.infer())
  1930. context = next(context_node.infer())
  1931. assert isinstance(context, nodes.FunctionDef)
  1932. assert isinstance(value, nodes.Const)
  1933. def test_unary_op_leaks_stop_iteration(self):
  1934. node = extract_node('+[] #@')
  1935. self.assertEqual(util.Uninferable, next(node.infer()))
  1936. def test_unary_operands(self):
  1937. ast_nodes = extract_node('''
  1938. import os
  1939. def func(): pass
  1940. from missing import missing
  1941. class GoodInstance(object):
  1942. def __pos__(self):
  1943. return 42
  1944. def __neg__(self):
  1945. return +self - 41
  1946. def __invert__(self):
  1947. return 42
  1948. class BadInstance(object):
  1949. def __pos__(self):
  1950. return lala
  1951. def __neg__(self):
  1952. return missing
  1953. class LambdaInstance(object):
  1954. __pos__ = lambda self: self.lala
  1955. __neg__ = lambda self: self.lala + 1
  1956. @property
  1957. def lala(self): return 24
  1958. instance = GoodInstance()
  1959. lambda_instance = LambdaInstance()
  1960. +instance #@
  1961. -instance #@
  1962. ~instance #@
  1963. --instance #@
  1964. +lambda_instance #@
  1965. -lambda_instance #@
  1966. bad_instance = BadInstance()
  1967. +bad_instance #@
  1968. -bad_instance #@
  1969. ~bad_instance #@
  1970. # These should be TypeErrors.
  1971. ~BadInstance #@
  1972. ~os #@
  1973. -func #@
  1974. +BadInstance #@
  1975. ''')
  1976. expected = [42, 1, 42, -1, 24, 25]
  1977. for node, value in zip(ast_nodes[:6], expected):
  1978. inferred = next(node.infer())
  1979. self.assertIsInstance(inferred, nodes.Const)
  1980. self.assertEqual(inferred.value, value)
  1981. for bad_node in ast_nodes[6:]:
  1982. inferred = next(bad_node.infer())
  1983. self.assertEqual(inferred, util.Uninferable)
  1984. def test_unary_op_instance_method_not_callable(self):
  1985. ast_node = extract_node('''
  1986. class A:
  1987. __pos__ = (i for i in range(10))
  1988. +A() #@
  1989. ''')
  1990. self.assertRaises(InferenceError, next, ast_node.infer())
  1991. def test_binary_op_type_errors(self):
  1992. ast_nodes = extract_node('''
  1993. import collections
  1994. 1 + "a" #@
  1995. 1 - [] #@
  1996. 1 * {} #@
  1997. 1 / collections #@
  1998. 1 ** (lambda x: x) #@
  1999. {} * {} #@
  2000. {} - {} #@
  2001. {} | {} #@
  2002. {} >> {} #@
  2003. [] + () #@
  2004. () + [] #@
  2005. [] * 2.0 #@
  2006. () * 2.0 #@
  2007. 2.0 >> 2.0 #@
  2008. class A(object): pass
  2009. class B(object): pass
  2010. A() + B() #@
  2011. class A1(object):
  2012. def __add__(self, other): return NotImplemented
  2013. A1() + A1() #@
  2014. class A(object):
  2015. def __add__(self, other): return NotImplemented
  2016. class B(object):
  2017. def __radd__(self, other): return NotImplemented
  2018. A() + B() #@
  2019. class Parent(object):
  2020. pass
  2021. class Child(Parent):
  2022. def __add__(self, other): return NotImplemented
  2023. Child() + Parent() #@
  2024. class A(object):
  2025. def __add__(self, other): return NotImplemented
  2026. class B(A):
  2027. def __radd__(self, other):
  2028. return NotImplemented
  2029. A() + B() #@
  2030. # Augmented
  2031. f = 1
  2032. f+=A() #@
  2033. x = 1
  2034. x+=[] #@
  2035. ''')
  2036. msg = "unsupported operand type(s) for {op}: {lhs!r} and {rhs!r}"
  2037. expected = [
  2038. msg.format(op="+", lhs="int", rhs="str"),
  2039. msg.format(op="-", lhs="int", rhs="list"),
  2040. msg.format(op="*", lhs="int", rhs="dict"),
  2041. msg.format(op="/", lhs="int", rhs="module"),
  2042. msg.format(op="**", lhs="int", rhs="function"),
  2043. msg.format(op="*", lhs="dict", rhs="dict"),
  2044. msg.format(op="-", lhs="dict", rhs="dict"),
  2045. msg.format(op="|", lhs="dict", rhs="dict"),
  2046. msg.format(op=">>", lhs="dict", rhs="dict"),
  2047. msg.format(op="+", lhs="list", rhs="tuple"),
  2048. msg.format(op="+", lhs="tuple", rhs="list"),
  2049. msg.format(op="*", lhs="list", rhs="float"),
  2050. msg.format(op="*", lhs="tuple", rhs="float"),
  2051. msg.format(op=">>", lhs="float", rhs="float"),
  2052. msg.format(op="+", lhs="A", rhs="B"),
  2053. msg.format(op="+", lhs="A1", rhs="A1"),
  2054. msg.format(op="+", lhs="A", rhs="B"),
  2055. msg.format(op="+", lhs="Child", rhs="Parent"),
  2056. msg.format(op="+", lhs="A", rhs="B"),
  2057. msg.format(op="+=", lhs="int", rhs="A"),
  2058. msg.format(op="+=", lhs="int", rhs="list"),
  2059. ]
  2060. for node, expected_value in zip(ast_nodes, expected):
  2061. errors = node.type_errors()
  2062. self.assertEqual(len(errors), 1)
  2063. error = errors[0]
  2064. self.assertEqual(str(error), expected_value)
  2065. def test_unary_type_errors(self):
  2066. ast_nodes = extract_node('''
  2067. import collections
  2068. ~[] #@
  2069. ~() #@
  2070. ~dict() #@
  2071. ~{} #@
  2072. ~set() #@
  2073. -set() #@
  2074. -"" #@
  2075. ~"" #@
  2076. +"" #@
  2077. class A(object): pass
  2078. ~(lambda: None) #@
  2079. ~A #@
  2080. ~A() #@
  2081. ~collections #@
  2082. ~2.0 #@
  2083. ''')
  2084. msg = "bad operand type for unary {op}: {type}"
  2085. expected = [
  2086. msg.format(op="~", type='list'),
  2087. msg.format(op="~", type='tuple'),
  2088. msg.format(op="~", type='dict'),
  2089. msg.format(op="~", type='dict'),
  2090. msg.format(op="~", type='set'),
  2091. msg.format(op="-", type='set'),
  2092. msg.format(op="-", type='str'),
  2093. msg.format(op="~", type='str'),
  2094. msg.format(op="+", type='str'),
  2095. msg.format(op="~", type='<lambda>'),
  2096. msg.format(op="~", type='A'),
  2097. msg.format(op="~", type='A'),
  2098. msg.format(op="~", type='collections'),
  2099. msg.format(op="~", type='float'),
  2100. ]
  2101. for node, expected_value in zip(ast_nodes, expected):
  2102. errors = node.type_errors()
  2103. self.assertEqual(len(errors), 1)
  2104. error = errors[0]
  2105. self.assertEqual(str(error), expected_value)
  2106. def test_unary_empty_type_errors(self):
  2107. # These aren't supported right now
  2108. ast_nodes = extract_node('''
  2109. ~(2 and []) #@
  2110. -(0 or {}) #@
  2111. ''')
  2112. expected = [
  2113. "bad operand type for unary ~: list",
  2114. "bad operand type for unary -: dict",
  2115. ]
  2116. for node, expected_value in zip(ast_nodes, expected):
  2117. errors = node.type_errors()
  2118. self.assertEqual(len(errors), 1, (expected, node))
  2119. self.assertEqual(str(errors[0]), expected_value)
  2120. def test_unary_type_errors_for_non_instance_objects(self):
  2121. node = extract_node('~slice(1, 2, 3)')
  2122. errors = node.type_errors()
  2123. self.assertEqual(len(errors), 1)
  2124. self.assertEqual(
  2125. str(errors[0]),
  2126. 'bad operand type for unary ~: slice'
  2127. )
  2128. def test_bool_value_recursive(self):
  2129. pairs = [
  2130. ('{}', False),
  2131. ('{1:2}', True),
  2132. ('()', False),
  2133. ('(1, 2)', True),
  2134. ('[]', False),
  2135. ('[1,2]', True),
  2136. ('frozenset()', False),
  2137. ('frozenset((1, 2))', True),
  2138. ]
  2139. for code, expected in pairs:
  2140. node = extract_node(code)
  2141. inferred = next(node.infer())
  2142. self.assertEqual(inferred.bool_value(), expected)
  2143. def test_genexpr_bool_value(self):
  2144. node = extract_node('''(x for x in range(10))''')
  2145. self.assertTrue(node.bool_value())
  2146. def test_name_bool_value(self):
  2147. node = extract_node('''
  2148. x = 42
  2149. y = x
  2150. y
  2151. ''')
  2152. self.assertIs(node.bool_value(), util.Uninferable)
  2153. def test_bool_value(self):
  2154. # Verify the truth value of nodes.
  2155. module = parse('''
  2156. import collections
  2157. collections_module = collections
  2158. def function(): pass
  2159. class Class(object):
  2160. def method(self): pass
  2161. dict_comp = {x:y for (x, y) in ((1, 2), (2, 3))}
  2162. set_comp = {x for x in range(10)}
  2163. list_comp = [x for x in range(10)]
  2164. lambda_func = lambda: None
  2165. unbound_method = Class.method
  2166. instance = Class()
  2167. bound_method = instance.method
  2168. def generator_func():
  2169. yield
  2170. def true_value():
  2171. return True
  2172. generator = generator_func()
  2173. bin_op = 1 + 2
  2174. bool_op = x and y
  2175. callfunc = test()
  2176. good_callfunc = true_value()
  2177. compare = 2 < 3
  2178. const_str_true = 'testconst'
  2179. const_str_false = ''
  2180. ''')
  2181. collections_module = next(module['collections_module'].infer())
  2182. self.assertTrue(collections_module.bool_value())
  2183. function = module['function']
  2184. self.assertTrue(function.bool_value())
  2185. klass = module['Class']
  2186. self.assertTrue(klass.bool_value())
  2187. dict_comp = next(module['dict_comp'].infer())
  2188. self.assertEqual(dict_comp, util.Uninferable)
  2189. set_comp = next(module['set_comp'].infer())
  2190. self.assertEqual(set_comp, util.Uninferable)
  2191. list_comp = next(module['list_comp'].infer())
  2192. self.assertEqual(list_comp, util.Uninferable)
  2193. lambda_func = next(module['lambda_func'].infer())
  2194. self.assertTrue(lambda_func)
  2195. unbound_method = next(module['unbound_method'].infer())
  2196. self.assertTrue(unbound_method)
  2197. bound_method = next(module['bound_method'].infer())
  2198. self.assertTrue(bound_method)
  2199. generator = next(module['generator'].infer())
  2200. self.assertTrue(generator)
  2201. bin_op = module['bin_op'].parent.value
  2202. self.assertIs(bin_op.bool_value(), util.Uninferable)
  2203. bool_op = module['bool_op'].parent.value
  2204. self.assertEqual(bool_op.bool_value(), util.Uninferable)
  2205. callfunc = module['callfunc'].parent.value
  2206. self.assertEqual(callfunc.bool_value(), util.Uninferable)
  2207. good_callfunc = next(module['good_callfunc'].infer())
  2208. self.assertTrue(good_callfunc.bool_value())
  2209. compare = module['compare'].parent.value
  2210. self.assertEqual(compare.bool_value(), util.Uninferable)
  2211. def test_bool_value_instances(self):
  2212. instances = extract_node('''
  2213. class FalseBoolInstance(object):
  2214. def {bool}(self):
  2215. return False
  2216. class TrueBoolInstance(object):
  2217. def {bool}(self):
  2218. return True
  2219. class FalseLenInstance(object):
  2220. def __len__(self):
  2221. return 0
  2222. class TrueLenInstance(object):
  2223. def __len__(self):
  2224. return 14
  2225. class AlwaysTrueInstance(object):
  2226. pass
  2227. class ErrorInstance(object):
  2228. def __bool__(self):
  2229. return lala
  2230. def __len__(self):
  2231. return lala
  2232. class NonMethods(object):
  2233. __bool__ = 1
  2234. __len__ = 2
  2235. FalseBoolInstance() #@
  2236. TrueBoolInstance() #@
  2237. FalseLenInstance() #@
  2238. TrueLenInstance() #@
  2239. AlwaysTrueInstance() #@
  2240. ErrorInstance() #@
  2241. '''.format(bool=BOOL_SPECIAL_METHOD))
  2242. expected = (False, True, False, True, True, util.Uninferable, util.Uninferable)
  2243. for node, expected_value in zip(instances, expected):
  2244. inferred = next(node.infer())
  2245. self.assertEqual(inferred.bool_value(), expected_value)
  2246. def test_bool_value_variable(self):
  2247. instance = extract_node('''
  2248. class VariableBoolInstance(object):
  2249. def __init__(self, value):
  2250. self.value = value
  2251. def {bool}(self):
  2252. return self.value
  2253. not VariableBoolInstance(True)
  2254. '''.format(bool=BOOL_SPECIAL_METHOD))
  2255. inferred = next(instance.infer())
  2256. self.assertIs(inferred.bool_value(), util.Uninferable)
  2257. def test_infer_coercion_rules_for_floats_complex(self):
  2258. ast_nodes = extract_node('''
  2259. 1 + 1.0 #@
  2260. 1 * 1.0 #@
  2261. 2 - 1.0 #@
  2262. 2 / 2.0 #@
  2263. 1 + 1j #@
  2264. 2 * 1j #@
  2265. 2 - 1j #@
  2266. 3 / 1j #@
  2267. ''')
  2268. expected_values = [2.0, 1.0, 1.0, 1.0, 1 + 1j, 2j, 2 - 1j, -3j]
  2269. for node, expected in zip(ast_nodes, expected_values):
  2270. inferred = next(node.infer())
  2271. self.assertEqual(inferred.value, expected)
  2272. def test_binop_list_with_elts(self):
  2273. ast_node = extract_node('''
  2274. x = [A] * 1
  2275. [1] + x
  2276. ''')
  2277. inferred = next(ast_node.infer())
  2278. self.assertIsInstance(inferred, nodes.List)
  2279. self.assertEqual(len(inferred.elts), 2)
  2280. self.assertIsInstance(inferred.elts[0], nodes.Const)
  2281. self.assertIsInstance(inferred.elts[1], nodes.Unknown)
  2282. def test_binop_same_types(self):
  2283. ast_nodes = extract_node('''
  2284. class A(object):
  2285. def __add__(self, other):
  2286. return 42
  2287. 1 + 1 #@
  2288. 1 - 1 #@
  2289. "a" + "b" #@
  2290. A() + A() #@
  2291. ''')
  2292. expected_values = [2, 0, "ab", 42]
  2293. for node, expected in zip(ast_nodes, expected_values):
  2294. inferred = next(node.infer())
  2295. self.assertIsInstance(inferred, nodes.Const)
  2296. self.assertEqual(inferred.value, expected)
  2297. def test_binop_different_types_reflected_only(self):
  2298. node = extract_node('''
  2299. class A(object):
  2300. pass
  2301. class B(object):
  2302. def __radd__(self, other):
  2303. return other
  2304. A() + B() #@
  2305. ''')
  2306. inferred = next(node.infer())
  2307. self.assertIsInstance(inferred, Instance)
  2308. self.assertEqual(inferred.name, 'A')
  2309. def test_binop_different_types_unknown_bases(self):
  2310. node = extract_node('''
  2311. from foo import bar
  2312. class A(bar):
  2313. pass
  2314. class B(object):
  2315. def __radd__(self, other):
  2316. return other
  2317. A() + B() #@
  2318. ''')
  2319. inferred = next(node.infer())
  2320. self.assertIs(inferred, util.Uninferable)
  2321. def test_binop_different_types_normal_not_implemented_and_reflected(self):
  2322. node = extract_node('''
  2323. class A(object):
  2324. def __add__(self, other):
  2325. return NotImplemented
  2326. class B(object):
  2327. def __radd__(self, other):
  2328. return other
  2329. A() + B() #@
  2330. ''')
  2331. inferred = next(node.infer())
  2332. self.assertIsInstance(inferred, Instance)
  2333. self.assertEqual(inferred.name, 'A')
  2334. def test_binop_different_types_no_method_implemented(self):
  2335. node = extract_node('''
  2336. class A(object):
  2337. pass
  2338. class B(object): pass
  2339. A() + B() #@
  2340. ''')
  2341. inferred = next(node.infer())
  2342. self.assertEqual(inferred, util.Uninferable)
  2343. def test_binop_different_types_reflected_and_normal_not_implemented(self):
  2344. node = extract_node('''
  2345. class A(object):
  2346. def __add__(self, other): return NotImplemented
  2347. class B(object):
  2348. def __radd__(self, other): return NotImplemented
  2349. A() + B() #@
  2350. ''')
  2351. inferred = next(node.infer())
  2352. self.assertEqual(inferred, util.Uninferable)
  2353. def test_binop_subtype(self):
  2354. node = extract_node('''
  2355. class A(object): pass
  2356. class B(A):
  2357. def __add__(self, other): return other
  2358. B() + A() #@
  2359. ''')
  2360. inferred = next(node.infer())
  2361. self.assertIsInstance(inferred, Instance)
  2362. self.assertEqual(inferred.name, 'A')
  2363. def test_binop_subtype_implemented_in_parent(self):
  2364. node = extract_node('''
  2365. class A(object):
  2366. def __add__(self, other): return other
  2367. class B(A): pass
  2368. B() + A() #@
  2369. ''')
  2370. inferred = next(node.infer())
  2371. self.assertIsInstance(inferred, Instance)
  2372. self.assertEqual(inferred.name, 'A')
  2373. def test_binop_subtype_not_implemented(self):
  2374. node = extract_node('''
  2375. class A(object):
  2376. pass
  2377. class B(A):
  2378. def __add__(self, other): return NotImplemented
  2379. B() + A() #@
  2380. ''')
  2381. inferred = next(node.infer())
  2382. self.assertEqual(inferred, util.Uninferable)
  2383. def test_binop_supertype(self):
  2384. node = extract_node('''
  2385. class A(object):
  2386. pass
  2387. class B(A):
  2388. def __radd__(self, other):
  2389. return other
  2390. A() + B() #@
  2391. ''')
  2392. inferred = next(node.infer())
  2393. self.assertIsInstance(inferred, Instance)
  2394. self.assertEqual(inferred.name, 'A')
  2395. def test_binop_supertype_rop_not_implemented(self):
  2396. node = extract_node('''
  2397. class A(object):
  2398. def __add__(self, other):
  2399. return other
  2400. class B(A):
  2401. def __radd__(self, other):
  2402. return NotImplemented
  2403. A() + B() #@
  2404. ''')
  2405. inferred = next(node.infer())
  2406. self.assertIsInstance(inferred, Instance)
  2407. self.assertEqual(inferred.name, 'B')
  2408. def test_binop_supertype_both_not_implemented(self):
  2409. node = extract_node('''
  2410. class A(object):
  2411. def __add__(self): return NotImplemented
  2412. class B(A):
  2413. def __radd__(self, other):
  2414. return NotImplemented
  2415. A() + B() #@
  2416. ''')
  2417. inferred = next(node.infer())
  2418. self.assertEqual(inferred, util.Uninferable)
  2419. def test_binop_inferrence_errors(self):
  2420. ast_nodes = extract_node('''
  2421. from unknown import Unknown
  2422. class A(object):
  2423. def __add__(self, other): return NotImplemented
  2424. class B(object):
  2425. def __add__(self, other): return Unknown
  2426. A() + Unknown #@
  2427. Unknown + A() #@
  2428. B() + A() #@
  2429. A() + B() #@
  2430. ''')
  2431. for node in ast_nodes:
  2432. self.assertEqual(next(node.infer()), util.Uninferable)
  2433. def test_binop_ambiguity(self):
  2434. ast_nodes = extract_node('''
  2435. class A(object):
  2436. def __add__(self, other):
  2437. if isinstance(other, B):
  2438. return NotImplemented
  2439. if type(other) is type(self):
  2440. return 42
  2441. return NotImplemented
  2442. class B(A): pass
  2443. class C(object):
  2444. def __radd__(self, other):
  2445. if isinstance(other, B):
  2446. return 42
  2447. return NotImplemented
  2448. A() + B() #@
  2449. B() + A() #@
  2450. A() + C() #@
  2451. C() + A() #@
  2452. ''')
  2453. for node in ast_nodes:
  2454. self.assertEqual(next(node.infer()), util.Uninferable)
  2455. def test_metaclass__getitem__(self):
  2456. ast_node = extract_node('''
  2457. class Meta(type):
  2458. def __getitem__(cls, arg):
  2459. return 24
  2460. import six
  2461. @six.add_metaclass(Meta)
  2462. class A(object):
  2463. pass
  2464. A['Awesome'] #@
  2465. ''')
  2466. inferred = next(ast_node.infer())
  2467. self.assertIsInstance(inferred, nodes.Const)
  2468. self.assertEqual(inferred.value, 24)
  2469. def test_bin_op_classes(self):
  2470. ast_node = extract_node('''
  2471. class Meta(type):
  2472. def __or__(self, other):
  2473. return 24
  2474. import six
  2475. @six.add_metaclass(Meta)
  2476. class A(object):
  2477. pass
  2478. A | A
  2479. ''')
  2480. inferred = next(ast_node.infer())
  2481. self.assertIsInstance(inferred, nodes.Const)
  2482. self.assertEqual(inferred.value, 24)
  2483. def test_bin_op_supertype_more_complicated_example(self):
  2484. ast_node = extract_node('''
  2485. class A(object):
  2486. def __init__(self):
  2487. self.foo = 42
  2488. def __add__(self, other):
  2489. return other.bar + self.foo / 2
  2490. class B(A):
  2491. def __init__(self):
  2492. self.bar = 24
  2493. def __radd__(self, other):
  2494. return NotImplemented
  2495. A() + B() #@
  2496. ''')
  2497. inferred = next(ast_node.infer())
  2498. self.assertIsInstance(inferred, nodes.Const)
  2499. self.assertEqual(int(inferred.value), 45)
  2500. def test_aug_op_same_type_not_implemented(self):
  2501. ast_node = extract_node('''
  2502. class A(object):
  2503. def __iadd__(self, other): return NotImplemented
  2504. def __add__(self, other): return NotImplemented
  2505. A() + A() #@
  2506. ''')
  2507. self.assertEqual(next(ast_node.infer()), util.Uninferable)
  2508. def test_aug_op_same_type_aug_implemented(self):
  2509. ast_node = extract_node('''
  2510. class A(object):
  2511. def __iadd__(self, other): return other
  2512. f = A()
  2513. f += A() #@
  2514. ''')
  2515. inferred = next(ast_node.infer())
  2516. self.assertIsInstance(inferred, Instance)
  2517. self.assertEqual(inferred.name, 'A')
  2518. def test_aug_op_same_type_aug_not_implemented_normal_implemented(self):
  2519. ast_node = extract_node('''
  2520. class A(object):
  2521. def __iadd__(self, other): return NotImplemented
  2522. def __add__(self, other): return 42
  2523. f = A()
  2524. f += A() #@
  2525. ''')
  2526. inferred = next(ast_node.infer())
  2527. self.assertIsInstance(inferred, nodes.Const)
  2528. self.assertEqual(inferred.value, 42)
  2529. def test_aug_op_subtype_both_not_implemented(self):
  2530. ast_node = extract_node('''
  2531. class A(object):
  2532. def __iadd__(self, other): return NotImplemented
  2533. def __add__(self, other): return NotImplemented
  2534. class B(A):
  2535. pass
  2536. b = B()
  2537. b+=A() #@
  2538. ''')
  2539. self.assertEqual(next(ast_node.infer()), util.Uninferable)
  2540. def test_aug_op_subtype_aug_op_is_implemented(self):
  2541. ast_node = extract_node('''
  2542. class A(object):
  2543. def __iadd__(self, other): return 42
  2544. class B(A):
  2545. pass
  2546. b = B()
  2547. b+=A() #@
  2548. ''')
  2549. inferred = next(ast_node.infer())
  2550. self.assertIsInstance(inferred, nodes.Const)
  2551. self.assertEqual(inferred.value, 42)
  2552. def test_aug_op_subtype_normal_op_is_implemented(self):
  2553. ast_node = extract_node('''
  2554. class A(object):
  2555. def __add__(self, other): return 42
  2556. class B(A):
  2557. pass
  2558. b = B()
  2559. b+=A() #@
  2560. ''')
  2561. inferred = next(ast_node.infer())
  2562. self.assertIsInstance(inferred, nodes.Const)
  2563. self.assertEqual(inferred.value, 42)
  2564. def test_aug_different_types_no_method_implemented(self):
  2565. ast_node = extract_node('''
  2566. class A(object): pass
  2567. class B(object): pass
  2568. f = A()
  2569. f += B() #@
  2570. ''')
  2571. self.assertEqual(next(ast_node.infer()), util.Uninferable)
  2572. def test_aug_different_types_augop_implemented(self):
  2573. ast_node = extract_node('''
  2574. class A(object):
  2575. def __iadd__(self, other): return other
  2576. class B(object): pass
  2577. f = A()
  2578. f += B() #@
  2579. ''')
  2580. inferred = next(ast_node.infer())
  2581. self.assertIsInstance(inferred, Instance)
  2582. self.assertEqual(inferred.name, 'B')
  2583. def test_aug_different_types_aug_not_implemented(self):
  2584. ast_node = extract_node('''
  2585. class A(object):
  2586. def __iadd__(self, other): return NotImplemented
  2587. def __add__(self, other): return other
  2588. class B(object): pass
  2589. f = A()
  2590. f += B() #@
  2591. ''')
  2592. inferred = next(ast_node.infer())
  2593. self.assertIsInstance(inferred, Instance)
  2594. self.assertEqual(inferred.name, 'B')
  2595. def test_aug_different_types_aug_not_implemented_rop_fallback(self):
  2596. ast_node = extract_node('''
  2597. class A(object):
  2598. def __iadd__(self, other): return NotImplemented
  2599. def __add__(self, other): return NotImplemented
  2600. class B(object):
  2601. def __radd__(self, other): return other
  2602. f = A()
  2603. f += B() #@
  2604. ''')
  2605. inferred = next(ast_node.infer())
  2606. self.assertIsInstance(inferred, Instance)
  2607. self.assertEqual(inferred.name, 'A')
  2608. def test_augop_supertypes_none_implemented(self):
  2609. ast_node = extract_node('''
  2610. class A(object): pass
  2611. class B(object): pass
  2612. a = A()
  2613. a += B() #@
  2614. ''')
  2615. self.assertEqual(next(ast_node.infer()), util.Uninferable)
  2616. def test_augop_supertypes_not_implemented_returned_for_all(self):
  2617. ast_node = extract_node('''
  2618. class A(object):
  2619. def __iadd__(self, other): return NotImplemented
  2620. def __add__(self, other): return NotImplemented
  2621. class B(object):
  2622. def __add__(self, other): return NotImplemented
  2623. a = A()
  2624. a += B() #@
  2625. ''')
  2626. self.assertEqual(next(ast_node.infer()), util.Uninferable)
  2627. def test_augop_supertypes_augop_implemented(self):
  2628. ast_node = extract_node('''
  2629. class A(object):
  2630. def __iadd__(self, other): return other
  2631. class B(A): pass
  2632. a = A()
  2633. a += B() #@
  2634. ''')
  2635. inferred = next(ast_node.infer())
  2636. self.assertIsInstance(inferred, Instance)
  2637. self.assertEqual(inferred.name, 'B')
  2638. def test_augop_supertypes_reflected_binop_implemented(self):
  2639. ast_node = extract_node('''
  2640. class A(object):
  2641. def __iadd__(self, other): return NotImplemented
  2642. class B(A):
  2643. def __radd__(self, other): return other
  2644. a = A()
  2645. a += B() #@
  2646. ''')
  2647. inferred = next(ast_node.infer())
  2648. self.assertIsInstance(inferred, Instance)
  2649. self.assertEqual(inferred.name, 'A')
  2650. def test_augop_supertypes_normal_binop_implemented(self):
  2651. ast_node = extract_node('''
  2652. class A(object):
  2653. def __iadd__(self, other): return NotImplemented
  2654. def __add__(self, other): return other
  2655. class B(A):
  2656. def __radd__(self, other): return NotImplemented
  2657. a = A()
  2658. a += B() #@
  2659. ''')
  2660. inferred = next(ast_node.infer())
  2661. self.assertIsInstance(inferred, Instance)
  2662. self.assertEqual(inferred.name, 'B')
  2663. @unittest.expectedFailure
  2664. def test_string_interpolation(self):
  2665. ast_nodes = extract_node('''
  2666. "a%d%d" % (1, 2) #@
  2667. "a%(x)s" % {"x": 42} #@
  2668. ''')
  2669. expected = ["a12", "a42"]
  2670. for node, expected_value in zip(ast_nodes, expected):
  2671. inferred = next(node.infer())
  2672. self.assertIsInstance(inferred, nodes.Const)
  2673. self.assertEqual(inferred.value, expected_value)
  2674. def test_mul_list_supports__index__(self):
  2675. ast_nodes = extract_node('''
  2676. class Index(object):
  2677. def __index__(self): return 2
  2678. class NotIndex(object): pass
  2679. class NotIndex2(object):
  2680. def __index__(self): return None
  2681. a = [1, 2]
  2682. a * Index() #@
  2683. a * NotIndex() #@
  2684. a * NotIndex2() #@
  2685. ''')
  2686. first = next(ast_nodes[0].infer())
  2687. self.assertIsInstance(first, nodes.List)
  2688. self.assertEqual([node.value for node in first.itered()],
  2689. [1, 2, 1, 2])
  2690. for rest in ast_nodes[1:]:
  2691. inferred = next(rest.infer())
  2692. self.assertEqual(inferred, util.Uninferable)
  2693. def test_subscript_supports__index__(self):
  2694. ast_nodes = extract_node('''
  2695. class Index(object):
  2696. def __index__(self): return 2
  2697. class LambdaIndex(object):
  2698. __index__ = lambda self: self.foo
  2699. @property
  2700. def foo(self): return 1
  2701. class NonIndex(object):
  2702. __index__ = lambda self: None
  2703. a = [1, 2, 3, 4]
  2704. a[Index()] #@
  2705. a[LambdaIndex()] #@
  2706. a[NonIndex()] #@
  2707. ''')
  2708. first = next(ast_nodes[0].infer())
  2709. self.assertIsInstance(first, nodes.Const)
  2710. self.assertEqual(first.value, 3)
  2711. second = next(ast_nodes[1].infer())
  2712. self.assertIsInstance(second, nodes.Const)
  2713. self.assertEqual(second.value, 2)
  2714. self.assertRaises(InferenceError, next, ast_nodes[2].infer())
  2715. def test_special_method_masquerading_as_another(self):
  2716. ast_node = extract_node('''
  2717. class Info(object):
  2718. def __add__(self, other):
  2719. return "lala"
  2720. __or__ = __add__
  2721. f = Info()
  2722. f | Info() #@
  2723. ''')
  2724. inferred = next(ast_node.infer())
  2725. self.assertIsInstance(inferred, nodes.Const)
  2726. self.assertEqual(inferred.value, "lala")
  2727. def test_unary_op_assignment(self):
  2728. ast_node = extract_node('''
  2729. class A(object): pass
  2730. def pos(self):
  2731. return 42
  2732. A.__pos__ = pos
  2733. f = A()
  2734. +f #@
  2735. ''')
  2736. inferred = next(ast_node.infer())
  2737. self.assertIsInstance(inferred, nodes.Const)
  2738. self.assertEqual(inferred.value, 42)
  2739. def test_unary_op_classes(self):
  2740. ast_node = extract_node('''
  2741. import six
  2742. class Meta(type):
  2743. def __invert__(self):
  2744. return 42
  2745. @six.add_metaclass(Meta)
  2746. class A(object):
  2747. pass
  2748. ~A
  2749. ''')
  2750. inferred = next(ast_node.infer())
  2751. self.assertIsInstance(inferred, nodes.Const)
  2752. self.assertEqual(inferred.value, 42)
  2753. def _slicing_test_helper(self, pairs, cls, get_elts):
  2754. for code, expected in pairs:
  2755. ast_node = extract_node(code)
  2756. inferred = next(ast_node.infer())
  2757. self.assertIsInstance(inferred, cls)
  2758. self.assertEqual(get_elts(inferred), expected,
  2759. ast_node.as_string())
  2760. def test_slicing_list(self):
  2761. pairs = (
  2762. ("[1, 2, 3][:] #@", [1, 2, 3]),
  2763. ("[1, 2, 3][0:] #@", [1, 2, 3]),
  2764. ("[1, 2, 3][None:] #@", [1, 2, 3]),
  2765. ("[1, 2, 3][None:None] #@", [1, 2, 3]),
  2766. ("[1, 2, 3][0:-1] #@", [1, 2]),
  2767. ("[1, 2, 3][0:2] #@", [1, 2]),
  2768. ("[1, 2, 3][0:2:None] #@", [1, 2]),
  2769. ("[1, 2, 3][::] #@", [1, 2, 3]),
  2770. ("[1, 2, 3][::2] #@", [1, 3]),
  2771. ("[1, 2, 3][::-1] #@", [3, 2, 1]),
  2772. ("[1, 2, 3][0:2:2] #@", [1]),
  2773. ("[1, 2, 3, 4, 5, 6][0:4-1:2+0] #@", [1, 3]),
  2774. )
  2775. self._slicing_test_helper(
  2776. pairs, nodes.List,
  2777. lambda inferred: [elt.value for elt in inferred.elts])
  2778. def test_slicing_tuple(self):
  2779. pairs = (
  2780. ("(1, 2, 3)[:] #@", [1, 2, 3]),
  2781. ("(1, 2, 3)[0:] #@", [1, 2, 3]),
  2782. ("(1, 2, 3)[None:] #@", [1, 2, 3]),
  2783. ("(1, 2, 3)[None:None] #@", [1, 2, 3]),
  2784. ("(1, 2, 3)[0:-1] #@", [1, 2]),
  2785. ("(1, 2, 3)[0:2] #@", [1, 2]),
  2786. ("(1, 2, 3)[0:2:None] #@", [1, 2]),
  2787. ("(1, 2, 3)[::] #@", [1, 2, 3]),
  2788. ("(1, 2, 3)[::2] #@", [1, 3]),
  2789. ("(1, 2, 3)[::-1] #@", [3, 2, 1]),
  2790. ("(1, 2, 3)[0:2:2] #@", [1]),
  2791. ("(1, 2, 3, 4, 5, 6)[0:4-1:2+0] #@", [1, 3]),
  2792. )
  2793. self._slicing_test_helper(
  2794. pairs, nodes.Tuple,
  2795. lambda inferred: [elt.value for elt in inferred.elts])
  2796. def test_slicing_str(self):
  2797. pairs = (
  2798. ("'123'[:] #@", "123"),
  2799. ("'123'[0:] #@", "123"),
  2800. ("'123'[None:] #@", "123"),
  2801. ("'123'[None:None] #@", "123"),
  2802. ("'123'[0:-1] #@", "12"),
  2803. ("'123'[0:2] #@", "12"),
  2804. ("'123'[0:2:None] #@", "12"),
  2805. ("'123'[::] #@", "123"),
  2806. ("'123'[::2] #@", "13"),
  2807. ("'123'[::-1] #@", "321"),
  2808. ("'123'[0:2:2] #@", "1"),
  2809. ("'123456'[0:4-1:2+0] #@", "13"),
  2810. )
  2811. self._slicing_test_helper(
  2812. pairs, nodes.Const, lambda inferred: inferred.value)
  2813. def test_invalid_slicing_primaries(self):
  2814. examples = [
  2815. "(lambda x: x)[1:2]",
  2816. "1[2]",
  2817. "(1, 2, 3)[a:]",
  2818. "(1, 2, 3)[object:object]",
  2819. "(1, 2, 3)[1:object]",
  2820. 'enumerate[2]'
  2821. ]
  2822. for code in examples:
  2823. node = extract_node(code)
  2824. self.assertRaises(InferenceError, next, node.infer())
  2825. def test_instance_slicing(self):
  2826. ast_nodes = extract_node('''
  2827. class A(object):
  2828. def __getitem__(self, index):
  2829. return [1, 2, 3, 4, 5][index]
  2830. A()[1:] #@
  2831. A()[:2] #@
  2832. A()[1:4] #@
  2833. ''')
  2834. expected_values = [
  2835. [2, 3, 4, 5],
  2836. [1, 2],
  2837. [2, 3, 4],
  2838. ]
  2839. for expected, node in zip(expected_values, ast_nodes):
  2840. inferred = next(node.infer())
  2841. self.assertIsInstance(inferred, nodes.List)
  2842. self.assertEqual([elt.value for elt in inferred.elts], expected)
  2843. def test_instance_slicing_slices(self):
  2844. ast_node = extract_node('''
  2845. class A(object):
  2846. def __getitem__(self, index):
  2847. return index
  2848. A()[1:] #@
  2849. ''')
  2850. inferred = next(ast_node.infer())
  2851. self.assertIsInstance(inferred, nodes.Slice)
  2852. self.assertEqual(inferred.lower.value, 1)
  2853. self.assertIsNone(inferred.upper)
  2854. def test_instance_slicing_fails(self):
  2855. ast_nodes = extract_node('''
  2856. class A(object):
  2857. def __getitem__(self, index):
  2858. return 1[index]
  2859. A()[4:5] #@
  2860. A()[2:] #@
  2861. ''')
  2862. for node in ast_nodes:
  2863. self.assertEqual(next(node.infer()), util.Uninferable)
  2864. def test_type__new__with_metaclass(self):
  2865. ast_node = extract_node('''
  2866. class Metaclass(type):
  2867. pass
  2868. class Entity(object):
  2869. pass
  2870. type.__new__(Metaclass, 'NewClass', (Entity,), {'a': 1}) #@
  2871. ''')
  2872. inferred = next(ast_node.infer())
  2873. self.assertIsInstance(inferred, nodes.ClassDef)
  2874. self.assertEqual(inferred.name, 'NewClass')
  2875. metaclass = inferred.metaclass()
  2876. self.assertEqual(metaclass, inferred.root()['Metaclass'])
  2877. ancestors = list(inferred.ancestors())
  2878. self.assertEqual(len(ancestors), 2)
  2879. self.assertEqual(ancestors[0], inferred.root()['Entity'])
  2880. attributes = inferred.getattr('a')
  2881. self.assertEqual(len(attributes), 1)
  2882. self.assertIsInstance(attributes[0], nodes.Const)
  2883. self.assertEqual(attributes[0].value, 1)
  2884. def test_type__new__not_enough_arguments(self):
  2885. ast_nodes = extract_node('''
  2886. type.__new__(1) #@
  2887. type.__new__(1, 2) #@
  2888. type.__new__(1, 2, 3) #@
  2889. type.__new__(1, 2, 3, 4, 5) #@
  2890. ''')
  2891. for node in ast_nodes:
  2892. inferred = next(node.infer())
  2893. self.assertIsInstance(inferred, Instance)
  2894. def test_type__new__invalid_mcs_argument(self):
  2895. ast_nodes = extract_node('''
  2896. class Class(object): pass
  2897. type.__new__(1, 2, 3, 4) #@
  2898. type.__new__(Class, 2, 3, 4) #@
  2899. ''')
  2900. for node in ast_nodes:
  2901. inferred = next(node.infer())
  2902. self.assertIsInstance(inferred, Instance)
  2903. def test_type__new__invalid_name(self):
  2904. ast_nodes = extract_node('''
  2905. class Class(type): pass
  2906. type.__new__(Class, object, 1, 2) #@
  2907. type.__new__(Class, 1, 1, 2) #@
  2908. type.__new__(Class, [], 1, 2) #@
  2909. ''')
  2910. for node in ast_nodes:
  2911. inferred = next(node.infer())
  2912. self.assertIsInstance(inferred, Instance)
  2913. def test_type__new__invalid_bases(self):
  2914. ast_nodes = extract_node('''
  2915. type.__new__(type, 'a', 1, 2) #@
  2916. type.__new__(type, 'a', [], 2) #@
  2917. type.__new__(type, 'a', {}, 2) #@
  2918. type.__new__(type, 'a', (1, ), 2) #@
  2919. type.__new__(type, 'a', (object, 1), 2) #@
  2920. ''')
  2921. for node in ast_nodes:
  2922. inferred = next(node.infer())
  2923. self.assertIsInstance(inferred, Instance)
  2924. def test_type__new__invalid_attrs(self):
  2925. ast_nodes = extract_node('''
  2926. type.__new__(type, 'a', (), ()) #@
  2927. type.__new__(type, 'a', (), object) #@
  2928. type.__new__(type, 'a', (), 1) #@
  2929. type.__new__(type, 'a', (), {object: 1}) #@
  2930. type.__new__(type, 'a', (), {1:2, "a":5}) #@
  2931. ''')
  2932. for node in ast_nodes:
  2933. inferred = next(node.infer())
  2934. self.assertIsInstance(inferred, Instance)
  2935. def test_type__new__metaclass_lookup(self):
  2936. ast_node = extract_node('''
  2937. class Metaclass(type):
  2938. def test(cls): pass
  2939. @classmethod
  2940. def test1(cls): pass
  2941. attr = 42
  2942. type.__new__(Metaclass, 'A', (), {}) #@
  2943. ''')
  2944. inferred = next(ast_node.infer())
  2945. self.assertIsInstance(inferred, nodes.ClassDef)
  2946. test = inferred.getattr('test')
  2947. self.assertEqual(len(test), 1)
  2948. self.assertIsInstance(test[0], BoundMethod)
  2949. self.assertIsInstance(test[0].bound, nodes.ClassDef)
  2950. self.assertEqual(test[0].bound, inferred)
  2951. test1 = inferred.getattr('test1')
  2952. self.assertEqual(len(test1), 1)
  2953. self.assertIsInstance(test1[0], BoundMethod)
  2954. self.assertIsInstance(test1[0].bound, nodes.ClassDef)
  2955. self.assertEqual(test1[0].bound, inferred.metaclass())
  2956. attr = inferred.getattr('attr')
  2957. self.assertEqual(len(attr), 1)
  2958. self.assertIsInstance(attr[0], nodes.Const)
  2959. self.assertEqual(attr[0].value, 42)
  2960. def test_type__new__metaclass_and_ancestors_lookup(self):
  2961. ast_node = extract_node('''
  2962. class Book(object):
  2963. title = 'Ubik'
  2964. class MetaBook(type):
  2965. title = 'Grimus'
  2966. type.__new__(MetaBook, 'book', (Book, ), {'title':'Catch 22'}) #@
  2967. ''')
  2968. inferred = next(ast_node.infer())
  2969. self.assertIsInstance(inferred, nodes.ClassDef)
  2970. titles = [title.value for title in inferred.igetattr('title')]
  2971. self.assertEqual(titles, ['Catch 22', 'Ubik', 'Grimus'])
  2972. @unittest.expectedFailure
  2973. def test_function_metaclasses(self):
  2974. # These are not supported right now, although
  2975. # they will be in the future.
  2976. ast_node = extract_node('''
  2977. import six
  2978. class BookMeta(type):
  2979. author = 'Rushdie'
  2980. def metaclass_function(*args):
  2981. return BookMeta
  2982. @six.add_metaclass(metaclass_function)
  2983. class Book(object):
  2984. pass
  2985. Book #@
  2986. ''')
  2987. inferred = next(ast_node.infer())
  2988. metaclass = inferred.metaclass()
  2989. self.assertIsInstance(metaclass, nodes.ClassDef)
  2990. self.assertEqual(metaclass.name, 'BookMeta')
  2991. author = next(inferred.igetattr('author'))
  2992. self.assertIsInstance(author, nodes.Const)
  2993. self.assertEqual(author.value, 'Rushdie')
  2994. def test_subscript_inference_error(self):
  2995. # Used to raise StopIteration
  2996. ast_node = extract_node('''
  2997. class AttributeDict(dict):
  2998. def __getitem__(self, name):
  2999. return self
  3000. flow = AttributeDict()
  3001. flow['app'] = AttributeDict()
  3002. flow['app']['config'] = AttributeDict()
  3003. flow['app']['config']['doffing'] = AttributeDict() #@
  3004. ''')
  3005. self.assertIsNone(helpers.safe_infer(ast_node.targets[0]))
  3006. def test_classmethod_inferred_by_context(self):
  3007. ast_node = extract_node('''
  3008. class Super(object):
  3009. def instance(cls):
  3010. return cls()
  3011. instance = classmethod(instance)
  3012. class Sub(Super):
  3013. def method(self):
  3014. return self
  3015. # should see the Sub.instance() is returning a Sub
  3016. # instance, not a Super instance
  3017. Sub.instance().method() #@
  3018. ''')
  3019. inferred = next(ast_node.infer())
  3020. self.assertIsInstance(inferred, Instance)
  3021. self.assertEqual(inferred.name, 'Sub')
  3022. def test_infer_call_result_invalid_dunder_call_on_instance(self):
  3023. ast_nodes = extract_node('''
  3024. class A:
  3025. __call__ = 42
  3026. class B:
  3027. __call__ = A()
  3028. class C:
  3029. __call = None
  3030. A() #@
  3031. B() #@
  3032. C() #@
  3033. ''')
  3034. for node in ast_nodes:
  3035. inferred = next(node.infer())
  3036. self.assertRaises(InferenceError, next, inferred.infer_call_result(node))
  3037. def test_context_call_for_context_managers(self):
  3038. ast_nodes = extract_node('''
  3039. class A:
  3040. def __enter__(self):
  3041. return self
  3042. class B:
  3043. __enter__ = lambda self: self
  3044. class C:
  3045. @property
  3046. def a(self): return A()
  3047. def __enter__(self):
  3048. return self.a
  3049. with A() as a:
  3050. a #@
  3051. with B() as b:
  3052. b #@
  3053. with C() as c:
  3054. c #@
  3055. ''')
  3056. first_a = next(ast_nodes[0].infer())
  3057. self.assertIsInstance(first_a, Instance)
  3058. self.assertEqual(first_a.name, 'A')
  3059. second_b = next(ast_nodes[1].infer())
  3060. self.assertIsInstance(second_b, Instance)
  3061. self.assertEqual(second_b.name, 'B')
  3062. third_c = next(ast_nodes[2].infer())
  3063. self.assertIsInstance(third_c, Instance)
  3064. self.assertEqual(third_c.name, 'A')
  3065. def test_metaclass_subclasses_arguments_are_classes_not_instances(self):
  3066. ast_node = extract_node('''
  3067. class A(type):
  3068. def test(cls):
  3069. return cls
  3070. import six
  3071. @six.add_metaclass(A)
  3072. class B(object):
  3073. pass
  3074. B.test() #@
  3075. ''')
  3076. inferred = next(ast_node.infer())
  3077. self.assertIsInstance(inferred, nodes.ClassDef)
  3078. self.assertEqual(inferred.name, 'B')
  3079. def test_infer_cls_in_class_methods(self):
  3080. ast_nodes = extract_node('''
  3081. class A(type):
  3082. def __call__(cls):
  3083. cls #@
  3084. class B(object):
  3085. def __call__(cls):
  3086. cls #@
  3087. ''')
  3088. first = next(ast_nodes[0].infer())
  3089. self.assertIsInstance(first, nodes.ClassDef)
  3090. second = next(ast_nodes[1].infer())
  3091. self.assertIsInstance(second, Instance)
  3092. @unittest.expectedFailure
  3093. def test_metaclass_arguments_are_classes_not_instances(self):
  3094. ast_node = extract_node('''
  3095. class A(type):
  3096. def test(cls): return cls
  3097. A.test() #@
  3098. ''')
  3099. # This is not supported yet
  3100. inferred = next(ast_node.infer())
  3101. self.assertIsInstance(inferred, nodes.ClassDef)
  3102. self.assertEqual(inferred.name, 'A')
  3103. @test_utils.require_version(minver='3.0')
  3104. def test_metaclass_with_keyword_args(self):
  3105. ast_node = extract_node('''
  3106. class TestMetaKlass(type):
  3107. def __new__(mcs, name, bases, ns, kwo_arg):
  3108. return super().__new__(mcs, name, bases, ns)
  3109. class TestKlass(metaclass=TestMetaKlass, kwo_arg=42): #@
  3110. pass
  3111. ''')
  3112. inferred = next(ast_node.infer())
  3113. self.assertIsInstance(inferred, nodes.ClassDef)
  3114. def test_delayed_attributes_without_slots(self):
  3115. ast_node = extract_node('''
  3116. class A(object):
  3117. __slots__ = ('a', )
  3118. a = A()
  3119. a.teta = 24
  3120. a.a = 24
  3121. a #@
  3122. ''')
  3123. inferred = next(ast_node.infer())
  3124. with self.assertRaises(exceptions.NotFoundError):
  3125. inferred.getattr('teta')
  3126. inferred.getattr('a')
  3127. @test_utils.require_version(maxver='3.0')
  3128. def test_delayed_attributes_with_old_style_classes(self):
  3129. ast_node = extract_node('''
  3130. class A:
  3131. __slots__ = ('a', )
  3132. a = A()
  3133. a.teta = 42
  3134. a #@
  3135. ''')
  3136. next(ast_node.infer()).getattr('teta')
  3137. def test_lambda_as_methods(self):
  3138. ast_node = extract_node('''
  3139. class X:
  3140. m = lambda self, arg: self.z + arg
  3141. z = 24
  3142. X().m(4) #@
  3143. ''')
  3144. inferred = next(ast_node.infer())
  3145. self.assertIsInstance(inferred, nodes.Const)
  3146. self.assertEqual(inferred.value, 28)
  3147. def test_inner_value_redefined_by_subclass(self):
  3148. ast_node = extract_node('''
  3149. class X(object):
  3150. M = lambda self, arg: "a"
  3151. x = 24
  3152. def __init__(self):
  3153. x = 24
  3154. self.m = self.M(x)
  3155. class Y(X):
  3156. M = lambda self, arg: arg + 1
  3157. def blurb(self):
  3158. self.m #@
  3159. ''')
  3160. inferred = next(ast_node.infer())
  3161. self.assertIsInstance(inferred, nodes.Const)
  3162. self.assertEqual(inferred.value, 25)
  3163. @unittest.expectedFailure
  3164. def test_inner_value_redefined_by_subclass_with_mro(self):
  3165. # This might work, but it currently doesn't due to not being able
  3166. # to reuse inference contexts.
  3167. ast_node = extract_node('''
  3168. class X(object):
  3169. M = lambda self, arg: arg + 1
  3170. x = 24
  3171. def __init__(self):
  3172. y = self
  3173. self.m = y.M(1) + y.z
  3174. class C(object):
  3175. z = 24
  3176. class Y(X, C):
  3177. M = lambda self, arg: arg + 1
  3178. def blurb(self):
  3179. self.m #@
  3180. ''')
  3181. inferred = next(ast_node.infer())
  3182. self.assertIsInstance(inferred, nodes.Const)
  3183. self.assertEqual(inferred.value, 25)
  3184. def test_getitem_of_class_raised_type_error(self):
  3185. # Test that we wrap an AttributeInferenceError
  3186. # and reraise it as a TypeError in Class.getitem
  3187. node = extract_node('''
  3188. def test():
  3189. yield
  3190. test()
  3191. ''')
  3192. inferred = next(node.infer())
  3193. with self.assertRaises(exceptions.AstroidTypeError):
  3194. inferred.getitem(nodes.Const('4'))
  3195. class GetattrTest(unittest.TestCase):
  3196. def test_yes_when_unknown(self):
  3197. ast_nodes = extract_node('''
  3198. from missing import Missing
  3199. getattr(1, Unknown) #@
  3200. getattr(Unknown, 'a') #@
  3201. getattr(Unknown, Unknown) #@
  3202. getattr(Unknown, Unknown, Unknown) #@
  3203. getattr(Missing, 'a') #@
  3204. getattr(Missing, Missing) #@
  3205. getattr('a', Missing) #@
  3206. getattr('a', Missing, Missing) #@
  3207. ''')
  3208. for node in ast_nodes[:4]:
  3209. self.assertRaises(InferenceError, next, node.infer())
  3210. for node in ast_nodes[4:]:
  3211. inferred = next(node.infer())
  3212. self.assertEqual(inferred, util.Uninferable, node)
  3213. def test_attrname_not_string(self):
  3214. ast_nodes = extract_node('''
  3215. getattr(1, 1) #@
  3216. c = int
  3217. getattr(1, c) #@
  3218. ''')
  3219. for node in ast_nodes:
  3220. self.assertRaises(InferenceError, next, node.infer())
  3221. def test_attribute_missing(self):
  3222. ast_nodes = extract_node('''
  3223. getattr(1, 'ala') #@
  3224. getattr(int, 'ala') #@
  3225. getattr(float, 'bala') #@
  3226. getattr({}, 'portocala') #@
  3227. ''')
  3228. for node in ast_nodes:
  3229. self.assertRaises(InferenceError, next, node.infer())
  3230. def test_default(self):
  3231. ast_nodes = extract_node('''
  3232. getattr(1, 'ala', None) #@
  3233. getattr(int, 'bala', int) #@
  3234. getattr(int, 'bala', getattr(int, 'portocala', None)) #@
  3235. ''')
  3236. first = next(ast_nodes[0].infer())
  3237. self.assertIsInstance(first, nodes.Const)
  3238. self.assertIsNone(first.value)
  3239. second = next(ast_nodes[1].infer())
  3240. self.assertIsInstance(second, nodes.ClassDef)
  3241. self.assertEqual(second.qname(), "%s.int" % BUILTINS)
  3242. third = next(ast_nodes[2].infer())
  3243. self.assertIsInstance(third, nodes.Const)
  3244. self.assertIsNone(third.value)
  3245. def test_lookup(self):
  3246. ast_nodes = extract_node('''
  3247. class A(object):
  3248. def test(self): pass
  3249. class B(A):
  3250. def test_b(self): pass
  3251. class C(A): pass
  3252. class E(C, B):
  3253. def test_e(self): pass
  3254. getattr(A(), 'test') #@
  3255. getattr(A, 'test') #@
  3256. getattr(E(), 'test_b') #@
  3257. getattr(E(), 'test') #@
  3258. class X(object):
  3259. def test(self):
  3260. getattr(self, 'test') #@
  3261. ''')
  3262. first = next(ast_nodes[0].infer())
  3263. self.assertIsInstance(first, BoundMethod)
  3264. self.assertEqual(first.bound.name, 'A')
  3265. second = next(ast_nodes[1].infer())
  3266. self.assertIsInstance(second, UnboundMethod)
  3267. self.assertIsInstance(second.parent, nodes.ClassDef)
  3268. self.assertEqual(second.parent.name, 'A')
  3269. third = next(ast_nodes[2].infer())
  3270. self.assertIsInstance(third, BoundMethod)
  3271. # Bound to E, but the provider is B.
  3272. self.assertEqual(third.bound.name, 'E')
  3273. self.assertEqual(third._proxied._proxied.parent.name, 'B')
  3274. fourth = next(ast_nodes[3].infer())
  3275. self.assertIsInstance(fourth, BoundMethod)
  3276. self.assertEqual(fourth.bound.name, 'E')
  3277. self.assertEqual(third._proxied._proxied.parent.name, 'B')
  3278. fifth = next(ast_nodes[4].infer())
  3279. self.assertIsInstance(fifth, BoundMethod)
  3280. self.assertEqual(fifth.bound.name, 'X')
  3281. def test_lambda(self):
  3282. node = extract_node('''
  3283. getattr(lambda x: x, 'f') #@
  3284. ''')
  3285. inferred = next(node.infer())
  3286. self.assertEqual(inferred, util.Uninferable)
  3287. class HasattrTest(unittest.TestCase):
  3288. def test_inference_errors(self):
  3289. ast_nodes = extract_node('''
  3290. from missing import Missing
  3291. hasattr(Unknown, 'ala') #@
  3292. hasattr(Missing, 'bala') #@
  3293. hasattr('portocala', Missing) #@
  3294. ''')
  3295. for node in ast_nodes:
  3296. inferred = next(node.infer())
  3297. self.assertEqual(inferred, util.Uninferable)
  3298. def test_attribute_is_missing(self):
  3299. ast_nodes = extract_node('''
  3300. class A: pass
  3301. hasattr(int, 'ala') #@
  3302. hasattr({}, 'bala') #@
  3303. hasattr(A(), 'portocala') #@
  3304. ''')
  3305. for node in ast_nodes:
  3306. inferred = next(node.infer())
  3307. self.assertIsInstance(inferred, nodes.Const)
  3308. self.assertFalse(inferred.value)
  3309. def test_attribute_is_not_missing(self):
  3310. ast_nodes = extract_node('''
  3311. class A(object):
  3312. def test(self): pass
  3313. class B(A):
  3314. def test_b(self): pass
  3315. class C(A): pass
  3316. class E(C, B):
  3317. def test_e(self): pass
  3318. hasattr(A(), 'test') #@
  3319. hasattr(A, 'test') #@
  3320. hasattr(E(), 'test_b') #@
  3321. hasattr(E(), 'test') #@
  3322. class X(object):
  3323. def test(self):
  3324. hasattr(self, 'test') #@
  3325. ''')
  3326. for node in ast_nodes:
  3327. inferred = next(node.infer())
  3328. self.assertIsInstance(inferred, nodes.Const)
  3329. self.assertTrue(inferred.value)
  3330. def test_lambda(self):
  3331. node = extract_node('''
  3332. hasattr(lambda x: x, 'f') #@
  3333. ''')
  3334. inferred = next(node.infer())
  3335. self.assertEqual(inferred, util.Uninferable)
  3336. class BoolOpTest(unittest.TestCase):
  3337. def test_bool_ops(self):
  3338. expected = [
  3339. ('1 and 2', 2),
  3340. ('0 and 2', 0),
  3341. ('1 or 2', 1),
  3342. ('0 or 2', 2),
  3343. ('0 or 0 or 1', 1),
  3344. ('1 and 2 and 3', 3),
  3345. ('1 and 2 or 3', 2),
  3346. ('1 and 0 or 3', 3),
  3347. ('1 or 0 and 2', 1),
  3348. ('(1 and 2) and (2 and 3)', 3),
  3349. ('not 2 and 3', False),
  3350. ('2 and not 3', False),
  3351. ('not 0 and 3', 3),
  3352. ('True and False', False),
  3353. ('not (True or False) and True', False),
  3354. ]
  3355. for code, expected_value in expected:
  3356. node = extract_node(code)
  3357. inferred = next(node.infer())
  3358. self.assertEqual(inferred.value, expected_value)
  3359. def test_yes_when_unknown(self):
  3360. ast_nodes = extract_node('''
  3361. from unknown import unknown, any, not_any
  3362. 0 and unknown #@
  3363. unknown or 0 #@
  3364. any or not_any and unknown #@
  3365. ''')
  3366. for node in ast_nodes:
  3367. inferred = next(node.infer())
  3368. self.assertEqual(inferred, util.Uninferable)
  3369. def test_other_nodes(self):
  3370. ast_nodes = extract_node('''
  3371. def test(): pass
  3372. test and 0 #@
  3373. 1 and test #@
  3374. ''')
  3375. first = next(ast_nodes[0].infer())
  3376. self.assertEqual(first.value, 0)
  3377. second = next(ast_nodes[1].infer())
  3378. self.assertIsInstance(second, nodes.FunctionDef)
  3379. self.assertEqual(second.name, 'test')
  3380. class TestCallable(unittest.TestCase):
  3381. def test_callable(self):
  3382. expected = [
  3383. ('callable(len)', True),
  3384. ('callable("a")', False),
  3385. ('callable(callable)', True),
  3386. ('callable(lambda x, y: x+y)', True),
  3387. ('import os; __(callable(os))', False),
  3388. ('callable(int)', True),
  3389. ('''
  3390. def test(): pass
  3391. callable(test) #@''', True),
  3392. ('''
  3393. class C1:
  3394. def meth(self): pass
  3395. callable(C1) #@''', True),
  3396. ]
  3397. for code, expected_value in expected:
  3398. node = extract_node(code)
  3399. inferred = next(node.infer())
  3400. self.assertEqual(inferred.value, expected_value)
  3401. def test_callable_methods(self):
  3402. ast_nodes = extract_node('''
  3403. class C:
  3404. def test(self): pass
  3405. @staticmethod
  3406. def static(): pass
  3407. @classmethod
  3408. def class_method(cls): pass
  3409. def __call__(self): pass
  3410. class D(C):
  3411. pass
  3412. class NotReallyCallableDueToPythonMisfeature(object):
  3413. __call__ = 42
  3414. callable(C.test) #@
  3415. callable(C.static) #@
  3416. callable(C.class_method) #@
  3417. callable(C().test) #@
  3418. callable(C().static) #@
  3419. callable(C().class_method) #@
  3420. C #@
  3421. C() #@
  3422. NotReallyCallableDueToPythonMisfeature() #@
  3423. staticmethod #@
  3424. classmethod #@
  3425. property #@
  3426. D #@
  3427. D() #@
  3428. ''')
  3429. for node in ast_nodes:
  3430. inferred = next(node.infer())
  3431. self.assertTrue(inferred)
  3432. def test_inference_errors(self):
  3433. ast_nodes = extract_node('''
  3434. from unknown import unknown
  3435. callable(unknown) #@
  3436. def test():
  3437. return unknown
  3438. callable(test()) #@
  3439. ''')
  3440. for node in ast_nodes:
  3441. inferred = next(node.infer())
  3442. self.assertEqual(inferred, util.Uninferable)
  3443. def test_not_callable(self):
  3444. ast_nodes = extract_node('''
  3445. callable("") #@
  3446. callable(1) #@
  3447. callable(True) #@
  3448. ''')
  3449. for node in ast_nodes:
  3450. inferred = next(node.infer())
  3451. self.assertFalse(inferred.value)
  3452. class TestBool(unittest.TestCase):
  3453. def test_bool(self):
  3454. pairs = [
  3455. ('bool()', False),
  3456. ('bool(1)', True),
  3457. ('bool(0)', False),
  3458. ('bool([])', False),
  3459. ('bool([1])', True),
  3460. ('bool({})', False),
  3461. ('bool(True)', True),
  3462. ('bool(False)', False),
  3463. ('bool(None)', False),
  3464. ('from unknown import Unknown; __(bool(Unknown))', util.Uninferable),
  3465. ]
  3466. for code, expected in pairs:
  3467. node = extract_node(code)
  3468. inferred = next(node.infer())
  3469. if expected is util.Uninferable:
  3470. self.assertEqual(expected, inferred)
  3471. else:
  3472. self.assertEqual(inferred.value, expected)
  3473. def test_bool_bool_special_method(self):
  3474. ast_nodes = extract_node('''
  3475. class FalseClass:
  3476. def {method}(self):
  3477. return False
  3478. class TrueClass:
  3479. def {method}(self):
  3480. return True
  3481. class C(object):
  3482. def __call__(self):
  3483. return False
  3484. class B(object):
  3485. {method} = C()
  3486. class LambdaBoolFalse(object):
  3487. {method} = lambda self: self.foo
  3488. @property
  3489. def foo(self): return 0
  3490. class FalseBoolLen(object):
  3491. __len__ = lambda self: self.foo
  3492. @property
  3493. def foo(self): return 0
  3494. bool(FalseClass) #@
  3495. bool(TrueClass) #@
  3496. bool(FalseClass()) #@
  3497. bool(TrueClass()) #@
  3498. bool(B()) #@
  3499. bool(LambdaBoolFalse()) #@
  3500. bool(FalseBoolLen()) #@
  3501. '''.format(method=BOOL_SPECIAL_METHOD))
  3502. expected = [True, True, False, True, False, False, False]
  3503. for node, expected_value in zip(ast_nodes, expected):
  3504. inferred = next(node.infer())
  3505. self.assertEqual(inferred.value, expected_value)
  3506. def test_bool_instance_not_callable(self):
  3507. ast_nodes = extract_node('''
  3508. class BoolInvalid(object):
  3509. {method} = 42
  3510. class LenInvalid(object):
  3511. __len__ = "a"
  3512. bool(BoolInvalid()) #@
  3513. bool(LenInvalid()) #@
  3514. '''.format(method=BOOL_SPECIAL_METHOD))
  3515. for node in ast_nodes:
  3516. inferred = next(node.infer())
  3517. self.assertEqual(inferred, util.Uninferable)
  3518. class TestType(unittest.TestCase):
  3519. def test_type(self):
  3520. pairs = [
  3521. ('type(1)', 'int'),
  3522. ('type(type)', 'type'),
  3523. ('type(None)', 'NoneType'),
  3524. ('type(object)', 'type'),
  3525. ('type(dict())', 'dict'),
  3526. ('type({})', 'dict'),
  3527. ('type(frozenset())', 'frozenset'),
  3528. ]
  3529. for code, expected in pairs:
  3530. node = extract_node(code)
  3531. inferred = next(node.infer())
  3532. self.assertIsInstance(inferred, nodes.ClassDef)
  3533. self.assertEqual(inferred.name, expected)
  3534. class ArgumentsTest(unittest.TestCase):
  3535. @staticmethod
  3536. def _get_dict_value(inferred):
  3537. items = inferred.items
  3538. return sorted((key.value, value.value) for key, value in items)
  3539. @staticmethod
  3540. def _get_tuple_value(inferred):
  3541. elts = inferred.elts
  3542. return tuple(elt.value for elt in elts)
  3543. def test_args(self):
  3544. expected_values = [(), (1, ), (2, 3), (4, 5),
  3545. (3, ), (), (3, 4, 5),
  3546. (), (), (4, ), (4, 5),
  3547. (), (3, ), (), (), (3, ), (42, )]
  3548. ast_nodes = extract_node('''
  3549. def func(*args):
  3550. return args
  3551. func() #@
  3552. func(1) #@
  3553. func(2, 3) #@
  3554. func(*(4, 5)) #@
  3555. def func(a, b, *args):
  3556. return args
  3557. func(1, 2, 3) #@
  3558. func(1, 2) #@
  3559. func(1, 2, 3, 4, 5) #@
  3560. def func(a, b, c=42, *args):
  3561. return args
  3562. func(1, 2) #@
  3563. func(1, 2, 3) #@
  3564. func(1, 2, 3, 4) #@
  3565. func(1, 2, 3, 4, 5) #@
  3566. func = lambda a, b, *args: args
  3567. func(1, 2) #@
  3568. func(1, 2, 3) #@
  3569. func = lambda a, b=42, *args: args
  3570. func(1) #@
  3571. func(1, 2) #@
  3572. func(1, 2, 3) #@
  3573. func(1, 2, *(42, )) #@
  3574. ''')
  3575. for node, expected_value in zip(ast_nodes, expected_values):
  3576. inferred = next(node.infer())
  3577. self.assertIsInstance(inferred, nodes.Tuple)
  3578. self.assertEqual(self._get_tuple_value(inferred), expected_value)
  3579. @test_utils.require_version('3.5')
  3580. def test_multiple_starred_args(self):
  3581. expected_values = [
  3582. (1, 2, 3),
  3583. (1, 4, 2, 3, 5, 6, 7),
  3584. ]
  3585. ast_nodes = extract_node('''
  3586. def func(a, b, *args):
  3587. return args
  3588. func(1, 2, *(1, ), *(2, 3)) #@
  3589. func(1, 2, *(1, ), 4, *(2, 3), 5, *(6, 7)) #@
  3590. ''')
  3591. for node, expected_value in zip(ast_nodes, expected_values):
  3592. inferred = next(node.infer())
  3593. self.assertIsInstance(inferred, nodes.Tuple)
  3594. self.assertEqual(self._get_tuple_value(inferred), expected_value)
  3595. def test_defaults(self):
  3596. expected_values = [42, 3, 41, 42]
  3597. ast_nodes = extract_node('''
  3598. def func(a, b, c=42, *args):
  3599. return c
  3600. func(1, 2) #@
  3601. func(1, 2, 3) #@
  3602. func(1, 2, c=41) #@
  3603. func(1, 2, 42, 41) #@
  3604. ''')
  3605. for node, expected_value in zip(ast_nodes, expected_values):
  3606. inferred = next(node.infer())
  3607. self.assertIsInstance(inferred, nodes.Const)
  3608. self.assertEqual(inferred.value, expected_value)
  3609. @test_utils.require_version('3.0')
  3610. def test_kwonly_args(self):
  3611. expected_values = [24, 24, 42, 23, 24, 24, 54]
  3612. ast_nodes = extract_node('''
  3613. def test(*, f, b): return f
  3614. test(f=24, b=33) #@
  3615. def test(a, *, f): return f
  3616. test(1, f=24) #@
  3617. def test(a, *, f=42): return f
  3618. test(1) #@
  3619. test(1, f=23) #@
  3620. def test(a, b, c=42, *args, f=24):
  3621. return f
  3622. test(1, 2, 3) #@
  3623. test(1, 2, 3, 4) #@
  3624. test(1, 2, 3, 4, 5, f=54) #@
  3625. ''')
  3626. for node, expected_value in zip(ast_nodes, expected_values):
  3627. inferred = next(node.infer())
  3628. self.assertIsInstance(inferred, nodes.Const)
  3629. self.assertEqual(inferred.value, expected_value)
  3630. def test_kwargs(self):
  3631. expected = [
  3632. [('a', 1), ('b', 2), ('c', 3)],
  3633. [('a', 1)],
  3634. [('a', 'b')],
  3635. ]
  3636. ast_nodes = extract_node('''
  3637. def test(**kwargs):
  3638. return kwargs
  3639. test(a=1, b=2, c=3) #@
  3640. test(a=1) #@
  3641. test(**{'a': 'b'}) #@
  3642. ''')
  3643. for node, expected_value in zip(ast_nodes, expected):
  3644. inferred = next(node.infer())
  3645. self.assertIsInstance(inferred, nodes.Dict)
  3646. value = self._get_dict_value(inferred)
  3647. self.assertEqual(value, expected_value)
  3648. def test_kwargs_and_other_named_parameters(self):
  3649. ast_nodes = extract_node('''
  3650. def test(a=42, b=24, **kwargs):
  3651. return kwargs
  3652. test(42, 24, c=3, d=4) #@
  3653. test(49, b=24, d=4) #@
  3654. test(a=42, b=33, c=3, d=42) #@
  3655. test(a=42, **{'c':42}) #@
  3656. ''')
  3657. expected_values = [
  3658. [('c', 3), ('d', 4)],
  3659. [('d', 4)],
  3660. [('c', 3), ('d', 42)],
  3661. [('c', 42)],
  3662. ]
  3663. for node, expected_value in zip(ast_nodes, expected_values):
  3664. inferred = next(node.infer())
  3665. self.assertIsInstance(inferred, nodes.Dict)
  3666. value = self._get_dict_value(inferred)
  3667. self.assertEqual(value, expected_value)
  3668. def test_kwargs_access_by_name(self):
  3669. expected_values = [42, 42, 42, 24]
  3670. ast_nodes = extract_node('''
  3671. def test(**kwargs):
  3672. return kwargs['f']
  3673. test(f=42) #@
  3674. test(**{'f': 42}) #@
  3675. test(**dict(f=42)) #@
  3676. def test(f=42, **kwargs):
  3677. return kwargs['l']
  3678. test(l=24) #@
  3679. ''')
  3680. for ast_node, value in zip(ast_nodes, expected_values):
  3681. inferred = next(ast_node.infer())
  3682. self.assertIsInstance(inferred, nodes.Const)
  3683. self.assertEqual(inferred.value, value)
  3684. @test_utils.require_version('3.5')
  3685. def test_multiple_kwargs(self):
  3686. expected_value = [
  3687. ('a', 1),
  3688. ('b', 2),
  3689. ('c', 3),
  3690. ('d', 4),
  3691. ('f', 42),
  3692. ]
  3693. ast_node = extract_node('''
  3694. def test(**kwargs):
  3695. return kwargs
  3696. test(a=1, b=2, **{'c': 3}, **{'d': 4}, f=42) #@
  3697. ''')
  3698. inferred = next(ast_node.infer())
  3699. self.assertIsInstance(inferred, nodes.Dict)
  3700. value = self._get_dict_value(inferred)
  3701. self.assertEqual(value, expected_value)
  3702. def test_kwargs_are_overridden(self):
  3703. ast_nodes = extract_node('''
  3704. def test(f):
  3705. return f
  3706. test(f=23, **{'f': 34}) #@
  3707. def test(f=None):
  3708. return f
  3709. test(f=23, **{'f':23}) #@
  3710. ''')
  3711. for ast_node in ast_nodes:
  3712. inferred = next(ast_node.infer())
  3713. self.assertEqual(inferred, util.Uninferable)
  3714. def test_fail_to_infer_args(self):
  3715. ast_nodes = extract_node('''
  3716. def test(a, **kwargs): return a
  3717. test(*missing) #@
  3718. test(*object) #@
  3719. test(*1) #@
  3720. def test(**kwargs): return kwargs
  3721. test(**miss) #@
  3722. test(**(1, 2)) #@
  3723. test(**1) #@
  3724. test(**{misss:1}) #@
  3725. test(**{object:1}) #@
  3726. test(**{1:1}) #@
  3727. test(**{'a':1, 'a':1}) #@
  3728. def test(a): return a
  3729. test() #@
  3730. test(1, 2, 3) #@
  3731. from unknown import unknown
  3732. test(*unknown) #@
  3733. def test(*args): return args
  3734. test(*unknown) #@
  3735. ''')
  3736. for node in ast_nodes:
  3737. inferred = next(node.infer())
  3738. self.assertEqual(inferred, util.Uninferable)
  3739. class SliceTest(unittest.TestCase):
  3740. def test_slice(self):
  3741. ast_nodes = [
  3742. ('[1, 2, 3][slice(None)]', [1, 2, 3]),
  3743. ('[1, 2, 3][slice(None, None)]', [1, 2, 3]),
  3744. ('[1, 2, 3][slice(None, None, None)]', [1, 2, 3]),
  3745. ('[1, 2, 3][slice(1, None)]', [2, 3]),
  3746. ('[1, 2, 3][slice(None, 1, None)]', [1]),
  3747. ('[1, 2, 3][slice(0, 1)]', [1]),
  3748. ('[1, 2, 3][slice(0, 3, 2)]', [1, 3]),
  3749. ]
  3750. for node, expected_value in ast_nodes:
  3751. ast_node = extract_node("__({})".format(node))
  3752. inferred = next(ast_node.infer())
  3753. self.assertIsInstance(inferred, nodes.List)
  3754. self.assertEqual([elt.value for elt in inferred.elts], expected_value)
  3755. def test_slice_inference_error(self):
  3756. ast_nodes = extract_node('''
  3757. from unknown import unknown
  3758. [1, 2, 3][slice(None, unknown, unknown)] #@
  3759. [1, 2, 3][slice(None, missing, missing)] #@
  3760. [1, 2, 3][slice(object, list, tuple)] #@
  3761. [1, 2, 3][slice(b'a')] #@
  3762. [1, 2, 3][slice(1, 'aa')] #@
  3763. [1, 2, 3][slice(1, 2.0, 3.0)] #@
  3764. [1, 2, 3][slice()] #@
  3765. [1, 2, 3][slice(1, 2, 3, 4)] #@
  3766. ''')
  3767. for node in ast_nodes:
  3768. self.assertRaises(InferenceError, next, node.infer())
  3769. def test_slice_attributes(self):
  3770. ast_nodes = [
  3771. ('slice(2, 3, 4)', (2, 3, 4)),
  3772. ('slice(None, None, 4)', (None, None, 4)),
  3773. ('slice(None, 1, None)', (None, 1, None)),
  3774. ]
  3775. for code, values in ast_nodes:
  3776. lower, upper, step = values
  3777. node = extract_node(code)
  3778. inferred = next(node.infer())
  3779. self.assertIsInstance(inferred, nodes.Slice)
  3780. lower_value = next(inferred.igetattr('start'))
  3781. self.assertIsInstance(lower_value, nodes.Const)
  3782. self.assertEqual(lower_value.value, lower)
  3783. higher_value = next(inferred.igetattr('stop'))
  3784. self.assertIsInstance(higher_value, nodes.Const)
  3785. self.assertEqual(higher_value.value, upper)
  3786. step_value = next(inferred.igetattr('step'))
  3787. self.assertIsInstance(step_value, nodes.Const)
  3788. self.assertEqual(step_value.value, step)
  3789. self.assertEqual(inferred.pytype(), '%s.slice' % BUILTINS)
  3790. def test_slice_type(self):
  3791. ast_node = extract_node('type(slice(None, None, None))')
  3792. inferred = next(ast_node.infer())
  3793. self.assertIsInstance(inferred, nodes.ClassDef)
  3794. self.assertEqual(inferred.name, 'slice')
  3795. class CallSiteTest(unittest.TestCase):
  3796. @staticmethod
  3797. def _call_site_from_call(call):
  3798. return arguments.CallSite.from_call(call)
  3799. def _test_call_site_pair(self, code, expected_args, expected_keywords):
  3800. ast_node = extract_node(code)
  3801. call_site = self._call_site_from_call(ast_node)
  3802. self.assertEqual(len(call_site.positional_arguments), len(expected_args))
  3803. self.assertEqual([arg.value for arg in call_site.positional_arguments],
  3804. expected_args)
  3805. self.assertEqual(len(call_site.keyword_arguments), len(expected_keywords))
  3806. for keyword, value in expected_keywords.items():
  3807. self.assertIn(keyword, call_site.keyword_arguments)
  3808. self.assertEqual(call_site.keyword_arguments[keyword].value, value)
  3809. def _test_call_site(self, pairs):
  3810. for pair in pairs:
  3811. self._test_call_site_pair(*pair)
  3812. @test_utils.require_version('3.5')
  3813. def test_call_site_starred_args(self):
  3814. pairs = [
  3815. (
  3816. "f(*(1, 2), *(2, 3), *(3, 4), **{'a':1}, **{'b': 2})",
  3817. [1, 2, 2, 3, 3, 4],
  3818. {'a': 1, 'b': 2}
  3819. ),
  3820. (
  3821. "f(1, 2, *(3, 4), 5, *(6, 7), f=24, **{'c':3})",
  3822. [1, 2, 3, 4, 5, 6, 7],
  3823. {'f':24, 'c': 3},
  3824. ),
  3825. # Too many fs passed into.
  3826. (
  3827. "f(f=24, **{'f':24})", [], {},
  3828. ),
  3829. ]
  3830. self._test_call_site(pairs)
  3831. def test_call_site(self):
  3832. pairs = [
  3833. (
  3834. "f(1, 2)", [1, 2], {}
  3835. ),
  3836. (
  3837. "f(1, 2, *(1, 2))", [1, 2, 1, 2], {}
  3838. ),
  3839. (
  3840. "f(a=1, b=2, c=3)", [], {'a':1, 'b':2, 'c':3}
  3841. )
  3842. ]
  3843. self._test_call_site(pairs)
  3844. def _test_call_site_valid_arguments(self, values, invalid):
  3845. for value in values:
  3846. ast_node = extract_node(value)
  3847. call_site = self._call_site_from_call(ast_node)
  3848. self.assertEqual(call_site.has_invalid_arguments(), invalid)
  3849. def test_call_site_valid_arguments(self):
  3850. values = [
  3851. "f(*lala)", "f(*1)", "f(*object)",
  3852. ]
  3853. self._test_call_site_valid_arguments(values, invalid=True)
  3854. values = [
  3855. "f()", "f(*(1, ))", "f(1, 2, *(2, 3))",
  3856. ]
  3857. self._test_call_site_valid_arguments(values, invalid=False)
  3858. def test_duplicated_keyword_arguments(self):
  3859. ast_node = extract_node('f(f=24, **{"f": 25})')
  3860. site = self._call_site_from_call(ast_node)
  3861. self.assertIn('f', site.duplicated_keywords)
  3862. class ObjectDunderNewTest(unittest.TestCase):
  3863. def test_object_dunder_new_is_inferred_if_decorator(self):
  3864. node = extract_node('''
  3865. @object.__new__
  3866. class instance(object):
  3867. pass
  3868. ''')
  3869. inferred = next(node.infer())
  3870. self.assertIsInstance(inferred, Instance)
  3871. def test_augassign_recursion():
  3872. """Make sure inference doesn't throw a RecursionError
  3873. Regression test for augmented assign dropping context.path
  3874. causing recursion errors
  3875. """
  3876. # infinitely recurses in python
  3877. code = """
  3878. def rec():
  3879. a = 0
  3880. a += rec()
  3881. return a
  3882. rec()
  3883. """
  3884. cls_node = extract_node(code)
  3885. assert next(cls_node.infer()) is util.Uninferable
  3886. if __name__ == '__main__':
  3887. unittest.main()