ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙimport unittest from test.support import cpython_only try: import _testcapi except ImportError: _testcapi = None import struct import collections import itertools import gc class FunctionCalls(unittest.TestCase): def test_kwargs_order(self): # bpo-34320: **kwargs should preserve order of passed OrderedDict od = collections.OrderedDict([('a', 1), ('b', 2)]) od.move_to_end('a') expected = list(od.items()) def fn(**kw): return kw res = fn(**od) self.assertIsInstance(res, dict) self.assertEqual(list(res.items()), expected) @cpython_only class CFunctionCallsErrorMessages(unittest.TestCase): def test_varargs0(self): msg = r"__contains__\(\) takes exactly one argument \(0 given\)" self.assertRaisesRegex(TypeError, msg, {}.__contains__) def test_varargs2(self): msg = r"__contains__\(\) takes exactly one argument \(2 given\)" self.assertRaisesRegex(TypeError, msg, {}.__contains__, 0, 1) def test_varargs3(self): msg = r"^from_bytes\(\) takes exactly 2 positional arguments \(3 given\)" self.assertRaisesRegex(TypeError, msg, int.from_bytes, b'a', 'little', False) def test_varargs1min(self): msg = r"get expected at least 1 argument, got 0" self.assertRaisesRegex(TypeError, msg, {}.get) msg = r"expected 1 argument, got 0" self.assertRaisesRegex(TypeError, msg, {}.__delattr__) def test_varargs2min(self): msg = r"getattr expected at least 2 arguments, got 0" self.assertRaisesRegex(TypeError, msg, getattr) def test_varargs1max(self): msg = r"input expected at most 1 argument, got 2" self.assertRaisesRegex(TypeError, msg, input, 1, 2) def test_varargs2max(self): msg = r"get expected at most 2 arguments, got 3" self.assertRaisesRegex(TypeError, msg, {}.get, 1, 2, 3) def test_varargs1_kw(self): msg = r"__contains__\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, {}.__contains__, x=2) def test_varargs2_kw(self): msg = r"__contains__\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, {}.__contains__, x=2, y=2) def test_varargs3_kw(self): msg = r"bool\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, bool, x=2) def test_varargs4_kw(self): msg = r"^list[.]index\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, [].index, x=2) def test_varargs5_kw(self): msg = r"^hasattr\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, hasattr, x=2) def test_varargs6_kw(self): msg = r"^getattr\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, getattr, x=2) def test_varargs7_kw(self): msg = r"^next\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, next, x=2) def test_varargs8_kw(self): msg = r"^_struct[.]pack\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.pack, x=2) def test_varargs9_kw(self): msg = r"^_struct[.]pack_into\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.pack_into, x=2) def test_varargs10_kw(self): msg = r"^deque[.]index\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, collections.deque().index, x=2) def test_varargs11_kw(self): msg = r"^Struct[.]pack\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.Struct.pack, struct.Struct(""), x=2) def test_varargs12_kw(self): msg = r"^staticmethod\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, staticmethod, func=id) def test_varargs13_kw(self): msg = r"^classmethod\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, classmethod, func=id) def test_varargs14_kw(self): msg = r"^product\(\) takes at most 1 keyword argument \(2 given\)$" self.assertRaisesRegex(TypeError, msg, itertools.product, 0, repeat=1, foo=2) def test_varargs15_kw(self): msg = r"^ImportError\(\) takes at most 2 keyword arguments \(3 given\)$" self.assertRaisesRegex(TypeError, msg, ImportError, 0, name=1, path=2, foo=3) def test_varargs16_kw(self): msg = r"^min\(\) takes at most 2 keyword arguments \(3 given\)$" self.assertRaisesRegex(TypeError, msg, min, 0, default=1, key=2, foo=3) def test_varargs17_kw(self): msg = r"^print\(\) takes at most 4 keyword arguments \(5 given\)$" self.assertRaisesRegex(TypeError, msg, print, 0, sep=1, end=2, file=3, flush=4, foo=5) def test_oldargs0_1(self): msg = r"keys\(\) takes no arguments \(1 given\)" self.assertRaisesRegex(TypeError, msg, {}.keys, 0) def test_oldargs0_2(self): msg = r"keys\(\) takes no arguments \(2 given\)" self.assertRaisesRegex(TypeError, msg, {}.keys, 0, 1) def test_oldargs0_1_kw(self): msg = r"keys\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, {}.keys, x=2) def test_oldargs0_2_kw(self): msg = r"keys\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, {}.keys, x=2, y=2) def test_oldargs1_0(self): msg = r"count\(\) takes exactly one argument \(0 given\)" self.assertRaisesRegex(TypeError, msg, [].count) def test_oldargs1_2(self): msg = r"count\(\) takes exactly one argument \(2 given\)" self.assertRaisesRegex(TypeError, msg, [].count, 1, 2) def test_oldargs1_0_kw(self): msg = r"count\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, [].count, x=2) def test_oldargs1_1_kw(self): msg = r"count\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, [].count, {}, x=2) def test_oldargs1_2_kw(self): msg = r"count\(\) takes no keyword arguments" self.assertRaisesRegex(TypeError, msg, [].count, x=2, y=2) class TestCallingConventions(unittest.TestCase): """Test calling using various C calling conventions (METH_*) from Python Subclasses test several kinds of functions (module-level, methods, class methods static methods) using these attributes: obj: the object that contains tested functions (as attributes) expected_self: expected "self" argument to the C function The base class tests module-level functions. """ def setUp(self): self.obj = self.expected_self = _testcapi def test_varargs(self): self.assertEqual( self.obj.meth_varargs(1, 2, 3), (self.expected_self, (1, 2, 3)), ) def test_varargs_ext(self): self.assertEqual( self.obj.meth_varargs(*(1, 2, 3)), (self.expected_self, (1, 2, 3)), ) def test_varargs_error_kw(self): msg = r"meth_varargs\(\) takes no keyword arguments" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_varargs(k=1), ) def test_varargs_keywords(self): self.assertEqual( self.obj.meth_varargs_keywords(1, 2, a=3, b=4), (self.expected_self, (1, 2), {'a': 3, 'b': 4}) ) def test_varargs_keywords_ext(self): self.assertEqual( self.obj.meth_varargs_keywords(*[1, 2], **{'a': 3, 'b': 4}), (self.expected_self, (1, 2), {'a': 3, 'b': 4}) ) def test_o(self): self.assertEqual(self.obj.meth_o(1), (self.expected_self, 1)) def test_o_ext(self): self.assertEqual(self.obj.meth_o(*[1]), (self.expected_self, 1)) def test_o_error_no_arg(self): msg = r"meth_o\(\) takes exactly one argument \(0 given\)" self.assertRaisesRegex(TypeError, msg, self.obj.meth_o) def test_o_error_two_args(self): msg = r"meth_o\(\) takes exactly one argument \(2 given\)" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_o(1, 2), ) def test_o_error_ext(self): msg = r"meth_o\(\) takes exactly one argument \(3 given\)" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_o(*(1, 2, 3)), ) def test_o_error_kw(self): msg = r"meth_o\(\) takes no keyword arguments" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_o(k=1), ) def test_o_error_arg_kw(self): msg = r"meth_o\(\) takes no keyword arguments" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_o(k=1), ) def test_noargs(self): self.assertEqual(self.obj.meth_noargs(), self.expected_self) def test_noargs_ext(self): self.assertEqual(self.obj.meth_noargs(*[]), self.expected_self) def test_noargs_error_arg(self): msg = r"meth_noargs\(\) takes no arguments \(1 given\)" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_noargs(1), ) def test_noargs_error_arg2(self): msg = r"meth_noargs\(\) takes no arguments \(2 given\)" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_noargs(1, 2), ) def test_noargs_error_ext(self): msg = r"meth_noargs\(\) takes no arguments \(3 given\)" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_noargs(*(1, 2, 3)), ) def test_noargs_error_kw(self): msg = r"meth_noargs\(\) takes no keyword arguments" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_noargs(k=1), ) def test_fastcall(self): self.assertEqual( self.obj.meth_fastcall(1, 2, 3), (self.expected_self, (1, 2, 3)), ) def test_fastcall_ext(self): self.assertEqual( self.obj.meth_fastcall(*(1, 2, 3)), (self.expected_self, (1, 2, 3)), ) def test_fastcall_error_kw(self): msg = r"meth_fastcall\(\) takes no keyword arguments" self.assertRaisesRegex( TypeError, msg, lambda: self.obj.meth_fastcall(k=1), ) def test_fastcall_keywords(self): self.assertEqual( self.obj.meth_fastcall_keywords(1, 2, a=3, b=4), (self.expected_self, (1, 2), {'a': 3, 'b': 4}) ) def test_fastcall_keywords_ext(self): self.assertEqual( self.obj.meth_fastcall_keywords(*(1, 2), **{'a': 3, 'b': 4}), (self.expected_self, (1, 2), {'a': 3, 'b': 4}) ) class TestCallingConventionsInstance(TestCallingConventions): """Test calling instance methods using various calling conventions""" def setUp(self): self.obj = self.expected_self = _testcapi.MethInstance() class TestCallingConventionsClass(TestCallingConventions): """Test calling class methods using various calling conventions""" def setUp(self): self.obj = self.expected_self = _testcapi.MethClass class TestCallingConventionsClassInstance(TestCallingConventions): """Test calling class methods on instance""" def setUp(self): self.obj = _testcapi.MethClass() self.expected_self = _testcapi.MethClass class TestCallingConventionsStatic(TestCallingConventions): """Test calling static methods using various calling conventions""" def setUp(self): self.obj = _testcapi.MethStatic() self.expected_self = None def pyfunc(arg1, arg2): return [arg1, arg2] def pyfunc_noarg(): return "noarg" class PythonClass: def method(self, arg1, arg2): return [arg1, arg2] def method_noarg(self): return "noarg" @classmethod def class_method(cls): return "classmethod" @staticmethod def static_method(): return "staticmethod" PYTHON_INSTANCE = PythonClass() NULL_OR_EMPTY = object() class FastCallTests(unittest.TestCase): """Test calling using various callables from C """ # Test calls with positional arguments CALLS_POSARGS = [ # (func, args: tuple, result) # Python function with 2 arguments (pyfunc, (1, 2), [1, 2]), # Python function without argument (pyfunc_noarg, (), "noarg"), # Python class methods (PythonClass.class_method, (), "classmethod"), (PythonClass.static_method, (), "staticmethod"), # Python instance methods (PYTHON_INSTANCE.method, (1, 2), [1, 2]), (PYTHON_INSTANCE.method_noarg, (), "noarg"), (PYTHON_INSTANCE.class_method, (), "classmethod"), (PYTHON_INSTANCE.static_method, (), "staticmethod"), # C callables are added later ] # Test calls with positional and keyword arguments CALLS_KWARGS = [ # (func, args: tuple, kwargs: dict, result) # Python function with 2 arguments (pyfunc, (1,), {'arg2': 2}, [1, 2]), (pyfunc, (), {'arg1': 1, 'arg2': 2}, [1, 2]), # Python instance methods (PYTHON_INSTANCE.method, (1,), {'arg2': 2}, [1, 2]), (PYTHON_INSTANCE.method, (), {'arg1': 1, 'arg2': 2}, [1, 2]), # C callables are added later ] # Add all the calling conventions and variants of C callables _instance = _testcapi.MethInstance() for obj, expected_self in ( (_testcapi, _testcapi), # module-level function (_instance, _instance), # bound method (_testcapi.MethClass, _testcapi.MethClass), # class method on class (_testcapi.MethClass(), _testcapi.MethClass), # class method on inst. (_testcapi.MethStatic, None), # static method ): CALLS_POSARGS.extend([ (obj.meth_varargs, (1, 2), (expected_self, (1, 2))), (obj.meth_varargs_keywords, (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), (obj.meth_fastcall, (1, 2), (expected_self, (1, 2))), (obj.meth_fastcall, (), (expected_self, ())), (obj.meth_fastcall_keywords, (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), (obj.meth_fastcall_keywords, (), (expected_self, (), NULL_OR_EMPTY)), (obj.meth_noargs, (), expected_self), (obj.meth_o, (123, ), (expected_self, 123)), ]) CALLS_KWARGS.extend([ (obj.meth_varargs_keywords, (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), (obj.meth_varargs_keywords, (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), (obj.meth_varargs_keywords, (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), (obj.meth_fastcall_keywords, (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), (obj.meth_fastcall_keywords, (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), (obj.meth_fastcall_keywords, (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), ]) def check_result(self, result, expected): if isinstance(expected, tuple) and expected[-1] is NULL_OR_EMPTY: if result[-1] in ({}, None): expected = (*expected[:-1], result[-1]) self.assertEqual(result, expected) def test_fastcall(self): # Test _PyObject_FastCall() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): result = _testcapi.pyobject_fastcall(func, args) self.check_result(result, expected) if not args: # args=NULL, nargs=0 result = _testcapi.pyobject_fastcall(func, None) self.check_result(result, expected) def test_vectorcall_dict(self): # Test PyObject_VectorcallDict() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): # kwargs=NULL result = _testcapi.pyobject_fastcalldict(func, args, None) self.check_result(result, expected) if not args: # args=NULL, nargs=0, kwargs=NULL result = _testcapi.pyobject_fastcalldict(func, None, None) self.check_result(result, expected) for func, args, kwargs, expected in self.CALLS_KWARGS: with self.subTest(func=func, args=args, kwargs=kwargs): result = _testcapi.pyobject_fastcalldict(func, args, kwargs) self.check_result(result, expected) def test_vectorcall(self): # Test PyObject_Vectorcall() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): # kwnames=NULL result = _testcapi.pyobject_vectorcall(func, args, None) self.check_result(result, expected) # kwnames=() result = _testcapi.pyobject_vectorcall(func, args, ()) self.check_result(result, expected) if not args: # kwnames=NULL result = _testcapi.pyobject_vectorcall(func, None, None) self.check_result(result, expected) # kwnames=() result = _testcapi.pyobject_vectorcall(func, None, ()) self.check_result(result, expected) for func, args, kwargs, expected in self.CALLS_KWARGS: with self.subTest(func=func, args=args, kwargs=kwargs): kwnames = tuple(kwargs.keys()) args = args + tuple(kwargs.values()) result = _testcapi.pyobject_vectorcall(func, args, kwnames) self.check_result(result, expected) def test_fastcall_clearing_dict(self): # Test bpo-36907: the point of the test is just checking that this # does not crash. class IntWithDict: __slots__ = ["kwargs"] def __init__(self, **kwargs): self.kwargs = kwargs def __index__(self): self.kwargs.clear() gc.collect() return 0 x = IntWithDict(dont_inherit=IntWithDict()) # We test the argument handling of "compile" here, the compilation # itself is not relevant. When we pass flags=x below, x.__index__() is # called, which changes the keywords dict. compile("pass", "", "exec", x, **x.kwargs) Py_TPFLAGS_HAVE_VECTORCALL = 1 << 11 Py_TPFLAGS_METHOD_DESCRIPTOR = 1 << 17 def testfunction(self): """some doc""" return self def testfunction_kw(self, *, kw): """some doc""" return self class TestPEP590(unittest.TestCase): def test_method_descriptor_flag(self): import functools cached = functools.lru_cache(1)(testfunction) self.assertFalse(type(repr).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertTrue(type(list.append).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertTrue(type(list.__add__).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertTrue(type(testfunction).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertTrue(type(cached).__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) # Heap type should not inherit Py_TPFLAGS_METHOD_DESCRIPTOR class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): pass self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_METHOD_DESCRIPTOR) def test_vectorcall_flag(self): self.assertTrue(_testcapi.MethodDescriptorBase.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) self.assertTrue(_testcapi.MethodDescriptorDerived.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) self.assertFalse(_testcapi.MethodDescriptorNopGet.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) self.assertTrue(_testcapi.MethodDescriptor2.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) # Heap type should not inherit Py_TPFLAGS_HAVE_VECTORCALL class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): pass self.assertFalse(MethodDescriptorHeap.__flags__ & Py_TPFLAGS_HAVE_VECTORCALL) def test_vectorcall_override(self): # Check that tp_call can correctly override vectorcall. # MethodDescriptorNopGet implements tp_call but it inherits from # MethodDescriptorBase, which implements vectorcall. Since # MethodDescriptorNopGet returns the args tuple when called, we check # additionally that no new tuple is created for this call. args = tuple(range(5)) f = _testcapi.MethodDescriptorNopGet() self.assertIs(f(*args), args) def test_vectorcall(self): # Test a bunch of different ways to call objects: # 1. vectorcall using PyVectorcall_Call() # (only for objects that support vectorcall directly) # 2. normal call # 3. vectorcall using PyObject_Vectorcall() # 4. call as bound method # 5. call using functools.partial # A list of (function, args, kwargs, result) calls to test calls = [(len, (range(42),), {}, 42), (list.append, ([], 0), {}, None), ([].append, (0,), {}, None), (sum, ([36],), {"start":6}, 42), (testfunction, (42,), {}, 42), (testfunction_kw, (42,), {"kw":None}, 42), (_testcapi.MethodDescriptorBase(), (0,), {}, True), (_testcapi.MethodDescriptorDerived(), (0,), {}, True), (_testcapi.MethodDescriptor2(), (0,), {}, False)] from _testcapi import pyobject_vectorcall, pyvectorcall_call from types import MethodType from functools import partial def vectorcall(func, args, kwargs): args = *args, *kwargs.values() kwnames = tuple(kwargs) return pyobject_vectorcall(func, args, kwnames) for (func, args, kwargs, expected) in calls: with self.subTest(str(func)): if not kwargs: self.assertEqual(expected, pyvectorcall_call(func, args)) self.assertEqual(expected, pyvectorcall_call(func, args, kwargs)) # Add derived classes (which do not support vectorcall directly, # but do support all other ways of calling). class MethodDescriptorHeap(_testcapi.MethodDescriptorBase): pass class MethodDescriptorOverridden(_testcapi.MethodDescriptorBase): def __call__(self, n): return 'new' class SuperBase: def __call__(self, *args): return super().__call__(*args) class MethodDescriptorSuper(SuperBase, _testcapi.MethodDescriptorBase): def __call__(self, *args): return super().__call__(*args) calls += [ (dict.update, ({},), {"key":True}, None), ({}.update, ({},), {"key":True}, None), (MethodDescriptorHeap(), (0,), {}, True), (MethodDescriptorOverridden(), (0,), {}, 'new'), (MethodDescriptorSuper(), (0,), {}, True), ] for (func, args, kwargs, expected) in calls: with self.subTest(str(func)): args1 = args[1:] meth = MethodType(func, args[0]) wrapped = partial(func) if not kwargs: self.assertEqual(expected, func(*args)) self.assertEqual(expected, pyobject_vectorcall(func, args, None)) self.assertEqual(expected, meth(*args1)) self.assertEqual(expected, wrapped(*args)) self.assertEqual(expected, func(*args, **kwargs)) self.assertEqual(expected, vectorcall(func, args, kwargs)) self.assertEqual(expected, meth(*args1, **kwargs)) self.assertEqual(expected, wrapped(*args, **kwargs)) if __name__ == "__main__": unittest.main()