�ɲɾ�����ӯ�����һ��ˣ��������С���˴��ͣ�������P���ҹ��ñ˽��ά�Բ��������˸߸ԣ�������ơ��ҹ��ñ�����ά�Բ���ˡ���˳^�ӣ������ӡ� ���ͯj�ӣ��ƺ���ӣ� ? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!PKU1]0test_parser.pyonu[ Afc@sSddlZddlZdadZdZdZedkrOendS(iNicCsdG|Gy7tj|}tj|}d}tj|}Wn8tjk ry}HdG|dGHtjtdan2X|tj|krHdG|GHtdandGHdS(Ns----s,parser module raised exception on input filet:is"parser module failed on input fileso.k.( tparsertsuitetst2tupletNonettuple2stt ParserErrort tracebackt print_exct _numFailed(tttfileNametstttuptnewterr((s//usr/lib64/python2.7/Demo/parser/test_parser.pyt testChunk s     cCs#t|j}t||dS(N(topentreadR(R R ((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttestFile!scCskddl}|jd}|sGddl}|jd}|jntt||jtdkdS(Niis*.pyi(tsystargvtglobtsorttmapRtexitR (RtargsR((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttest%s     t__main__(RRR RRRt__name__(((s//usr/lib64/python2.7/Demo/parser/test_parser.pyts    PKU1]rX docstring.pyonu[ ^c@s dZdS(sSome documentation. N(t__doc__(((s-/usr/lib64/python2.7/Demo/parser/docstring.pyttPKU1]g$$ example.pycnu[ ^c@sdZddlZddlZddlZddlZddlZddlmZmZdZdddYZ dddYZ d e e fd YZ d e fd YZ d e e fdYZ ddZejejdgffZejejejejejejejejejejejejejejej ej!ej"ej#ej$dgfffffffffffffffffej%dfffZ&dS(sSimple code to extract class & function docstrings from a module. This code is used as an example in the library reference manual in the section on using the parser module. Refer to the manual for a thorough discussion of the operation of this code. iN(tListTypet TupleTypecCsVt|j}tjjtjj|d}tj|}t|j |S(sRetrieve information from the parse tree of a source file. fileName Name of the file to read Python source code from. i( topentreadtostpathtbasenametsplitexttparsertsuitet ModuleInfottotuple(tfileNametsourceRtast((s+/usr/lib64/python2.7/Demo/parser/example.pytget_docss"t SuiteInfoBasecBsVeZdZdZddZdZdZdZdZ dZ dZ RS( tcCs,i|_i|_|r(|j|ndS(N(t _class_infot_function_infot _extract_info(tselfttree((s+/usr/lib64/python2.7/Demo/parser/example.pyt__init__!s  cCst|dkr2ttd|d\}}ntt|d\}}|rgt|d|_nx|dD]}tt|\}}|rr|d}|dtjkr|dd}t||j |scCs |jjS(N(Rtkeys(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_namesAscCs |j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_infoDscCs/y|j|SWntk r*|j|SXdS(N(RtKeyErrorR(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pyt __getitem__Gs N( t__name__t __module__RR+tNoneRRR*R,R.R/R1(((s+/usr/lib64/python2.7/Demo/parser/example.pyRs      t SuiteFuncInfocBseZdZdZRS(cCs |jjS(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_namesQscCs |j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_infoTs(R2R3R6R7(((s+/usr/lib64/python2.7/Demo/parser/example.pyR5Ns R"cBseZddZRS(cCs5|dd|_tj||r*|dp-ddS(Niii(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyRYsN(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR"XsR$cBs&eZddZdZdZRS(cCs5|dd|_tj||r*|dp-ddS(Niii(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyR_scCs |jjS(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_namescscCs |j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_infofsN(R2R3R4RR8R9(((s+/usr/lib64/python2.7/Demo/parser/example.pyR$^s  R cBseZdddZRS(scCsU||_tj|||rQtt|d\}}|rQ|d|_qQndS(NiR(R+RRRRR(RRR)R%R&((s+/usr/lib64/python2.7/Demo/parser/example.pyRks  N(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR jscCs|dkri}nt|tkr?|||dsF      1   + ?PKU1]9\n]n] unparse.pyonu[ ^c@sdZddlZddlZddlZddlZdeejjdZdZ dfdYZ ej dZ d Z d Zed kreejdndS( s'Usage: unparse.py iNt1eicCsZt|}y|t|Wntk r3n#Xx|D]}|||q;WdS(s<Call f on each item in seq, calling inter() in between. N(titertnextt StopIteration(tintertftseqtx((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt interleave s   tUnparsercBseZdZejdZddZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2id0d16d2d36d4d56d6d76Z3d8Z4i d4d96d6d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6Z5dOZ6i dPdQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6d^d_6d`da6dbdc6Z7ddZ8idee9j:6dfe9j;6Z<dgZ=dhZ>diZ?djZ@dkZAdlZBdmZCdnZDdoZEdpZFdqZGdrZHRS(ssMethods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarded. cCsI||_g|_d|_|j||jjd|jjdS(sTUnparser(tree, file=sys.stdout) -> None. Print the source for tree to file.itN(Rtfuture_importst_indenttdispatchtwritetflush(tselfttreetfile((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt__init__s     R cCs#|jjdd|j|dS(sBIndent a piece of text, according to the current indentation levels s N(RRR (Rttext((s+/usr/lib64/python2.7/Demo/parser/unparse.pytfill'scCs|jj|dS(s+Append a piece of text to the current line.N(RR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR+scCs |jd|jd7_dS(s(Print ':', and increase the indentation.t:iN(RR (R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytenter/s cCs|jd8_dS(sDecrease the indentation level.iN(R (R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytleave4scCsXt|tr1x|D]}|j|qWdSt|d|jj}||dS(s:Dispatcher function, dispatching tree type T to method _T.Nt_(t isinstancetlistR tgetattrt __class__t__name__(RRtttmeth((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR 8s  cCs%x|jD]}|j|q WdS(N(tbodyR (RRtstmt((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ModuleIscCs|j|j|jdS(N(RR tvalue(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExprNs cs0jdtfdj|jdS(Nsimport cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pytTR (RRR tnames(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ImportRs cs|jr8|jdkr8jjd|jDnjdjd|j|jruj|jnjdtfdj|jdS(Nt __future__css|]}|jVqdS(N(tname(t.0tn((s+/usr/lib64/python2.7/Demo/parser/unparse.pys Yssfrom t.s import cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&`R ( tmoduleR textendR'RRtlevelRR (RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ImportFromVs    cCsL|jx+|jD] }|j||jdqW|j|jdS(Ns = (RttargetsR RR$(RRttarget((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Assignbs   cCsS|j|j|j|jd|j|jjjd|j|jdS(Nt s= ( RR R3RtbinoptopRRR$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _AugAssignis %cCs:|jd|jr6|jd|j|jndS(NtreturnR5(RR$RR (RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Returnos   cCs|jddS(Ntpass(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_PassuscCs|jddS(Ntbreak(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BreakxscCs|jddS(Ntcontinue(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _Continue{scs0jdtfdj|jdS(Nsdel cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R (RRR R2(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Delete~s cCsJ|jd|j|j|jrF|jd|j|jndS(Nsassert s, (RR ttesttmsgR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Asserts    cCss|jd|j|j|jrF|jd|j|jn|jro|jd|j|jndS(Nsexec s in s, (RR R!tglobalsRtlocals(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Execs     cCs|jdt}|jrB|jd|j|jt}nx:|jD]/}|rh|jdnt}|j|qLW|js|jdndS(Nsprint s>>s, t,(RtFalsetdestRR tTruetvaluestnl(RRtdo_commate((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Prints     cs0jdtfdj|jdS(Nsglobal cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R (RRRR'(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Globals cCsT|jd|jd|jrC|jd|j|jn|jddS(Nt(tyieldR5t)(RR$R (RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Yields     cCs|jd|jr)|j|jn|jrR|jd|j|jn|jr{|jd|j|jndS(Nsraise s, (RttypeR tinstRttback(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Raises      cCs|jd|j|j|j|jx|jD]}|j|q;W|jr|jd|j|j|j|jndS(Nttrytelse(RRR R!Rthandlerstorelse(RRtex((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _TryExcepts      cCst|jdkrAt|jdtjrA|j|jn1|jd|j|j|j|j|jd|j|j|j |jdS(NiiRZtfinally( tlenR!Rtastt TryExceptR RRRt finalbody(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _TryFinallys.     cCs|jd|jr6|jd|j|jn|jr_|jd|j|jn|j|j|j|jdS(NtexceptR5s as (RRVRR R*RR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExceptHandlers      cCs|jdx+|jD] }|jd|j|qW|jd|j|jr|jdx+|jD] }|j||jdqoW|jdn|j|j|j|jdS(Ns t@sclass RRs, RT( Rtdecorator_listRR R*tbasesRR!R(RRtdecota((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ClassDefs      cCs|jdx+|jD] }|jd|j|qW|jd|jd|j|j|jd|j|j|j|jdS(Ns Rhsdef RRRT( RRiRR R*targsRR!R(RRRk((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _FunctionDefs    cCs|jd|j|j|jd|j|j|j|j|j|j|jr|jd|j|j|j|jndS(Nsfor s in R[( RR R3RRRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Fors       cCs|jd|j|j|j|j|j|jx|jrt|jdkrt|jdt j r|jd}|jd|j|j|j|j|j|jqDW|jr |jd|j|j|j|jndS(Nsif iiselif R[( RR RBRR!RR]RaRRbtIf(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_If s$   !      cCs|jd|j|j|j|j|j|j|jr~|jd|j|j|j|jndS(Nswhile R[(RR RBRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_While!s      cCsn|jd|j|j|jrF|jd|j|jn|j|j|j|jdS(Nswith s as (RR t context_exprt optional_varsRRR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_With-s    cCsd|jkr(|jt|jnct|jtrW|jdt|jn4t|jtr|jt|jjdndS(Ntunicode_literalstbtu(R RtreprtsRtstrtunicodetlstrip(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Str8s"cCs|j|jdS(N(Rtid(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NameEscCs.|jd|j|j|jddS(Nt`(RR R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ReprHs cCsjt|j}|jdr.|jdn|j|jdt|jdrf|jdndS(Nt-RRtinfRT(RzR,t startswithRtreplacetINFSTR(RRtrepr_n((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NumMs cs=jdtfdj|jjddS(Nt[cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&YR t](RRR telts(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ListWs cCsO|jd|j|jx|jD]}|j|q'W|jddS(NRR(RR teltt generators(RRtgen((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ListComp\s  cCsO|jd|j|jx|jD]}|j|q'W|jddS(NRRRT(RR RR(RRR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _GeneratorExpcs  cCsO|jd|j|jx|jD]}|j|q'W|jddS(Nt{t}(RR RR(RRR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_SetCompjs  cCsl|jd|j|j|jd|j|jx|jD]}|j|qDW|jddS(NRs: R(RR tkeyR$R(RRR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _DictCompqs  cCsl|jd|j|j|jd|j|jx+|jD] }|jd|j|qDWdS(Ns for s in s if (RR R3Rtifs(RRt if_clause((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_comprehensionzs   cCsh|jd|j|j|jd|j|j|jd|j|j|jddS(NRRs if s else RT(RR R!RBR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_IfExps   cs=jdtfdj|jjddS(NRcs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R R(RRR R(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Sets csUjdfd}tfd|t|j|jjddS(NRcs7|\}}j|jdj|dS(Ns: (R R(tpairtktv(R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyt write_pairs   cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R R(RRtziptkeysRL(RRR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Dicts (cs{jdt|jdkrK|j\}j|jdntfdj|jjddS(NRRiRHcs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R RT(RRaRR R(RRR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Tuples   t~tInverttnottNott+tUAddRtUSubcCs|jd|j|j|jjj|jdt|jtjrt|jtj r|jd|j |j|jdn|j |j|jddS(NRRR5RT( RtunopR7RRRRbRtoperandtNumR (RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_UnaryOps  * tAddtSubt*tMultt/tDivt%tMods<>tRShiftt|tBitOrt^tBitXort&tBitAnds//tFloorDivs**tPowcCsc|jd|j|j|jd|j|jjjd|j|j|jddS(NRRR5RT(RR tleftR6R7RRtright(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BinOps  %s==tEqs!=tNotEqttGts>=tGtEtistIssis nottIsNottintInsnot intNotIncCs|jd|j|jxRt|j|jD];\}}|jd|j|jjd|j|q3W|jddS(NRRR5RT( RR RRtopst comparatorstcmpopsRR(RRtoRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Compares  ""tandtorcsWjddj|jjtfdj|jjddS(NRRs %s cs jS(N(R((R{R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R RT(RtboolopsR7RRR RL(RR((R{Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BoolOps "cCsk|j|jt|jtjrJt|jjtrJ|jdn|jd|j|jdS(NR5R-( R R$RRbRR,tintRtattr(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _Attributes * cCs8|j|j|jdt}x:|jD]/}|rI|jdnt}|j|q-Wx:|jD]/}|r|jdnt}|j|qjW|jr|r|jdnt}|jd|j|jn|jr'|r|jdnt}|jd|j|jn|jddS(NRRs, Rs**RT( R tfuncRRIRnRKtkeywordststarargstkwargs(RRtcommaRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Calls4     cCs>|j|j|jd|j|j|jddS(NRR(R R$Rtslice(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _Subscripts cCs|jddS(Ns...(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _EllipsisscCs|j|jdS(N(R R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_IndexscCsr|jr|j|jn|jd|jrE|j|jn|jrn|jd|j|jndS(NR(tlowerR Rtuppertstep(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Slices     cs#tfdj|jdS(Ncs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR& R (RR tdims(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ExtSlice scCs't}dgt|jt|j|j}xot|j|D][\}}|r^t}n |jd|j|f|rC|jd|j|qCqCW|j r|rt}n |jd|jd|j|j n|j r#|rt}n |jd|jd|j ndS(Ns, t=Rs**( RKtNoneRaRntdefaultsRRIRR tvarargtkwarg(RRtfirstRRltd((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _argumentss**          cCs1|j|j|jd|j|jdS(NR(RtargR R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_keyword)s cCsX|jd|jd|j|j|jd|j|j|jddS(NRRslambda s: RT(RR RnR!(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Lambda.s    cCs4|j|j|jr0|jd|jndS(Ns as (RR*tasname(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_alias6s (IRt __module__t__doc__tsyststdoutRRRRRR R#R%R(R1R4R8R:R<R>R@RARDRGRPRQRURYR_ReRgRmRoRpRrRsRvRRRRRRRRRRRRRRRRR6RRRRbtAndtOrRRRRRRRRRRRRR(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR s                                " &# -          cCsMt|d}|j}WdQXt||dtj}t||dS(Ntrtexec(topentreadtcompileRbt PyCF_ONLY_ASTR (tfilenametoutputtpyfiletsourceR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt roundtrip;scCsy5gtj|D]}|jdr|^q}Wn%tk r\tjjd|nXx|D]}tjj||}tjj |rt j }d|GHyt ||Wqt k r}dt|GHqXqdtjj|rdt|qdqdWdS(Ns.pysDirectory not readable: %ss Testing %ss$ Failed to compile, exception is %s(tostlistdirtendswithtOSErrorRtstderrRtpathtjointisfilet cStringIOtStringIOR t ExceptionRztisdirttestdir(RlR,R'tfullnameR RO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyRCs5    cCsQ|ddkr2x:|dD]}t|qWnx|D]}t|q9WdS(Nis --testdiri(RR (RnRl((s+/usr/lib64/python2.7/Demo/parser/unparse.pytmainUs  t__main__(RRRbRRRzt float_infot max_10_expRRR RR RRRtargv(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyts     %   PKU1]0test_parser.pycnu[ Afc@sSddlZddlZdadZdZdZedkrOendS(iNicCsdG|Gy7tj|}tj|}d}tj|}Wn8tjk ry}HdG|dGHtjtdan2X|tj|krHdG|GHtdandGHdS(Ns----s,parser module raised exception on input filet:is"parser module failed on input fileso.k.( tparsertsuitetst2tupletNonettuple2stt ParserErrort tracebackt print_exct _numFailed(tttfileNametstttuptnewterr((s//usr/lib64/python2.7/Demo/parser/test_parser.pyt testChunk s     cCs#t|j}t||dS(N(topentreadR(R R ((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttestFile!scCskddl}|jd}|sGddl}|jd}|jntt||jtdkdS(Niis*.pyi(tsystargvtglobtsorttmapRtexitR (RtargsR((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttest%s     t__main__(RRR RRRt__name__(((s//usr/lib64/python2.7/Demo/parser/test_parser.pyts    PKU1]64?!!test_unparse.pyonu[ ^c@sddlZddlmZddlZddlZddlZddlZddlZddlZdZ dZ dZ dZ dZ dZd Zd Zd ejfd YZd efdYZdefdYZdZedkrendS(iN(t test_supportcCs(t|d}|j}WdQX|S(snRead and return the contents of a Python source file (as a string), taking into account the file encoding.trN(topentread(tfilenametpyfiletsource((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt read_pyfile ssQdef f(): for x in range(10): break else: y = 2 z = 3 sIdef g(): while True: break else: y = 2 z = 3 sQfrom . import fred from .. import barney from .australia import shrimp as prawns s@f1(arg) @f2 class Foo: pass s=if cond1: suite1 elif cond2: suite2 else: suite3 s,if cond1: suite1 elif cond2: suite2 sctry: suite1 except ex1: suite2 except ex2: suite3 else: suite4 finally: suite5 t ASTTestCasecBseZdZddZRS(cCsDtj|}tj|}|jtj|tj|dS(N(tasttdumpt assertEqual(tselftast1tast2tdump1tdump2((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytassertASTEqualMstinternalcCslt||dtj}tj}tj|||j}t||dtj}|j||dS(Ntexec( tcompileR t PyCF_ONLY_ASTt cStringIOtStringIOtunparsetUnparsertgetvalueR(R tcode1RR tunparse_buffertcode2R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytcheck_roundtripRs   (t__name__t __module__RR(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyRLs tUnparseTestCasecBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZRS(cCs|jddS(Ns del x, y, z(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_del_statement]scCs|jd|jddS(Ns45 << 2s13 >> 7(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_shifts`s cCs|jtdS(N(Rtfor_else(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_for_elsedscCs|jtdS(N(Rt while_else(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_while_elsegscCsE|jd|jd|jd|jd|jddS(Ns(-1)**7s(-1.)**8s(-1j)**6snot True or FalsesTrue or not False(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_unary_parensjs     cCs|jddS(Ns 3 .__abs__()(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_integer_parensqscCs8|jd|jd|jd|jddS(Nt1e1000s-1e1000t1e1000js-1e1000j(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_huge_floatts   cCs7|jttj d|jdtjddS(Nis-(%s)(Rtstrtsystmaxint(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_min_intzscCsR|jd|jd|jd|jd|jd|jddS(Nt7js-7js-(7j)t0js-0js-(0j)(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_imaginary_literals~s      cCsl|jd|jd|jd|jd|jd|jd|jd|jddS( Ns-0s-(0)s-0b0s-(0b0)s-0o0s-(0o0)s-0x0s-(0x0)(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_negative_zeros       cCs|jddS(Ns(lambda: int)()(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_lambda_parenthesesscCs|jd|jddS(Ns 1 < 4 <= 5sa is b is c is not d(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_chained_comparisonss cCs_|jd|jd|jd|jd|jd|jd|jddS(Ns def f(): passsdef f(a): passsdef f(b = 2): passsdef f(a, b): passsdef f(a, b = 2): passsdef f(a = 5, b = 2): passsdef f(*args, **kwargs): pass(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_function_argumentss      cCs|jtdS(N(Rtrelative_import(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_relative_importscCs|jddS(Nsb'123'(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_bytesscCs|jddS(Ns{'a', 'b', 'c'}(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_literalscCs|jddS(Ns{x for x in range(5)}(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_comprehensionscCs|jddS(Ns{x: x*x for x in range(10)}(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_dict_comprehensionscCs|jtdS(N(Rtclass_decorator(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_class_decoratorsscCs|jt|jtdS(N(Rtelif1telif2(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_elifss cCs|jtdS(N(Rttry_except_finally(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_try_except_finallys(RR R"R#R%R'R(R)R,R0R3R4R5R6R7R9R:R;R<R=R?RBRD(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyR!Zs*                  tDirectoryTestCasecBs2eZdZdejjddfZdZRS(s:Test roundtrip behaviour on all files in Lib and Lib/test.tLibttestcCstjjtjjttjtj}g}x~|jD]s}tjj||}xUtj|D]D}|jdre|j d re|j tjj||qeqeWq:Wx<|D]4}t j rd|GHnt |}|j|qWdS(Ns.pytbads Testing %s(tostpathtjointdirnamet__file__tpardirttest_directoriestlistdirtendswitht startswithtappendRtverboseRR(R tdist_dirtnamestdttest_dirtnRR((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_filess*'    (RR t__doc__RIRJRKRORZ(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyREscCstjttdS(N(Rt run_unittestR!RE(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_mainst__main__(tunittestRGRRR.RIttokenizeR RRR$R&R8R>R@RARCtTestCaseRR!RER]R(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyts*           _  PKU1]64?!!test_unparse.pycnu[ ^c@sddlZddlmZddlZddlZddlZddlZddlZddlZdZ dZ dZ dZ dZ dZd Zd Zd ejfd YZd efdYZdefdYZdZedkrendS(iN(t test_supportcCs(t|d}|j}WdQX|S(snRead and return the contents of a Python source file (as a string), taking into account the file encoding.trN(topentread(tfilenametpyfiletsource((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt read_pyfile ssQdef f(): for x in range(10): break else: y = 2 z = 3 sIdef g(): while True: break else: y = 2 z = 3 sQfrom . import fred from .. import barney from .australia import shrimp as prawns s@f1(arg) @f2 class Foo: pass s=if cond1: suite1 elif cond2: suite2 else: suite3 s,if cond1: suite1 elif cond2: suite2 sctry: suite1 except ex1: suite2 except ex2: suite3 else: suite4 finally: suite5 t ASTTestCasecBseZdZddZRS(cCsDtj|}tj|}|jtj|tj|dS(N(tasttdumpt assertEqual(tselftast1tast2tdump1tdump2((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytassertASTEqualMstinternalcCslt||dtj}tj}tj|||j}t||dtj}|j||dS(Ntexec( tcompileR t PyCF_ONLY_ASTt cStringIOtStringIOtunparsetUnparsertgetvalueR(R tcode1RR tunparse_buffertcode2R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytcheck_roundtripRs   (t__name__t __module__RR(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyRLs tUnparseTestCasecBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZRS(cCs|jddS(Ns del x, y, z(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_del_statement]scCs|jd|jddS(Ns45 << 2s13 >> 7(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_shifts`s cCs|jtdS(N(Rtfor_else(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_for_elsedscCs|jtdS(N(Rt while_else(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_while_elsegscCsE|jd|jd|jd|jd|jddS(Ns(-1)**7s(-1.)**8s(-1j)**6snot True or FalsesTrue or not False(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_unary_parensjs     cCs|jddS(Ns 3 .__abs__()(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_integer_parensqscCs8|jd|jd|jd|jddS(Nt1e1000s-1e1000t1e1000js-1e1000j(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_huge_floatts   cCs7|jttj d|jdtjddS(Nis-(%s)(Rtstrtsystmaxint(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_min_intzscCsR|jd|jd|jd|jd|jd|jddS(Nt7js-7js-(7j)t0js-0js-(0j)(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_imaginary_literals~s      cCsl|jd|jd|jd|jd|jd|jd|jd|jddS( Ns-0s-(0)s-0b0s-(0b0)s-0o0s-(0o0)s-0x0s-(0x0)(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_negative_zeros       cCs|jddS(Ns(lambda: int)()(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_lambda_parenthesesscCs|jd|jddS(Ns 1 < 4 <= 5sa is b is c is not d(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_chained_comparisonss cCs_|jd|jd|jd|jd|jd|jd|jddS(Ns def f(): passsdef f(a): passsdef f(b = 2): passsdef f(a, b): passsdef f(a, b = 2): passsdef f(a = 5, b = 2): passsdef f(*args, **kwargs): pass(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_function_argumentss      cCs|jtdS(N(Rtrelative_import(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_relative_importscCs|jddS(Nsb'123'(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_bytesscCs|jddS(Ns{'a', 'b', 'c'}(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_literalscCs|jddS(Ns{x for x in range(5)}(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_comprehensionscCs|jddS(Ns{x: x*x for x in range(10)}(R(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_dict_comprehensionscCs|jtdS(N(Rtclass_decorator(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_class_decoratorsscCs|jt|jtdS(N(Rtelif1telif2(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_elifss cCs|jtdS(N(Rttry_except_finally(R ((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_try_except_finallys(RR R"R#R%R'R(R)R,R0R3R4R5R6R7R9R:R;R<R=R?RBRD(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyR!Zs*                  tDirectoryTestCasecBs2eZdZdejjddfZdZRS(s:Test roundtrip behaviour on all files in Lib and Lib/test.tLibttestcCstjjtjjttjtj}g}x~|jD]s}tjj||}xUtj|D]D}|jdre|j d re|j tjj||qeqeWq:Wx<|D]4}t j rd|GHnt |}|j|qWdS(Ns.pytbads Testing %s(tostpathtjointdirnamet__file__tpardirttest_directoriestlistdirtendswitht startswithtappendRtverboseRR(R tdist_dirtnamestdttest_dirtnRR((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_filess*'    (RR t__doc__RIRJRKRORZ(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyREscCstjttdS(N(Rt run_unittestR!RE(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt test_mainst__main__(tunittestRGRRR.RIttokenizeR RRR$R&R8R>R@RARCtTestCaseRR!RER]R(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyts*           _  PKU1]GjD source.pynu["""Exmaple file to be parsed for the parsermodule example. The classes and functions in this module exist only to exhibit the ability of the handling information extraction from nested definitions using parse trees. They shouldn't interest you otherwise! """ class Simple: "This class does very little." def method(self): "This method does almost nothing." return 1 class Nested: "This is a nested class." def nested_method(self): "Method of Nested class." def nested_function(): "Function in method of Nested class." pass return nested_function def function(): "This function lives at the module level." return 0 PKU1]^READMEnu[These files are from the large example of using the `parser' module. Refer to the Python Library Reference for more information. It also contains examples for the AST parser. Files: ------ FILES -- list of files associated with the parser module. README -- this file. docstring.py -- sample source file containing only a module docstring. example.py -- module that uses the `parser' module to extract information from the parse tree of Python source code. simple.py -- sample source containing a "short form" definition. source.py -- sample source code used to demonstrate ability to handle nested constructs easily using the functions and classes in example.py. test_parser.py program to put the parser module through its paces. test_unparse.py tests for the unparse module unparse.py AST (2.7) based example to recreate source code from an AST. Enjoy! PKU1]c simple.pycnu[ ^c@s dZdS(cCsdS(smaybe a docstringN((((s*/usr/lib64/python2.7/Demo/parser/simple.pytftN(R(((s*/usr/lib64/python2.7/Demo/parser/simple.pytRPKU1]rX docstring.pycnu[ ^c@s dZdS(sSome documentation. N(t__doc__(((s-/usr/lib64/python2.7/Demo/parser/docstring.pyttPKU1]g$$ example.pyonu[ ^c@sdZddlZddlZddlZddlZddlZddlmZmZdZdddYZ dddYZ d e e fd YZ d e fd YZ d e e fdYZ ddZejejdgffZejejejejejejejejejejejejejejej ej!ej"ej#ej$dgfffffffffffffffffej%dfffZ&dS(sSimple code to extract class & function docstrings from a module. This code is used as an example in the library reference manual in the section on using the parser module. Refer to the manual for a thorough discussion of the operation of this code. iN(tListTypet TupleTypecCsVt|j}tjjtjj|d}tj|}t|j |S(sRetrieve information from the parse tree of a source file. fileName Name of the file to read Python source code from. i( topentreadtostpathtbasenametsplitexttparsertsuitet ModuleInfottotuple(tfileNametsourceRtast((s+/usr/lib64/python2.7/Demo/parser/example.pytget_docss"t SuiteInfoBasecBsVeZdZdZddZdZdZdZdZ dZ dZ RS( tcCs,i|_i|_|r(|j|ndS(N(t _class_infot_function_infot _extract_info(tselfttree((s+/usr/lib64/python2.7/Demo/parser/example.pyt__init__!s  cCst|dkr2ttd|d\}}ntt|d\}}|rgt|d|_nx|dD]}tt|\}}|rr|d}|dtjkr|dd}t||j |scCs |jjS(N(Rtkeys(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_namesAscCs |j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_infoDscCs/y|j|SWntk r*|j|SXdS(N(RtKeyErrorR(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pyt __getitem__Gs N( t__name__t __module__RR+tNoneRRR*R,R.R/R1(((s+/usr/lib64/python2.7/Demo/parser/example.pyRs      t SuiteFuncInfocBseZdZdZRS(cCs |jjS(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_namesQscCs |j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_infoTs(R2R3R6R7(((s+/usr/lib64/python2.7/Demo/parser/example.pyR5Ns R"cBseZddZRS(cCs5|dd|_tj||r*|dp-ddS(Niii(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyRYsN(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR"XsR$cBs&eZddZdZdZRS(cCs5|dd|_tj||r*|dp-ddS(Niii(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyR_scCs |jjS(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_namescscCs |j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_infofsN(R2R3R4RR8R9(((s+/usr/lib64/python2.7/Demo/parser/example.pyR$^s  R cBseZdddZRS(scCsU||_tj|||rQtt|d\}}|rQ|d|_qQndS(NiR(R+RRRRR(RRR)R%R&((s+/usr/lib64/python2.7/Demo/parser/example.pyRks  N(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR jscCs|dkri}nt|tkr?|||dsF      1   + ?PKU1]Nk[[FILESnu[Demo/parser Doc/libparser.tex Lib/AST.py Lib/symbol.py Lib/token.py Modules/parsermodule.c PKU1]qϭ simple.pynu[def f(): "maybe a docstring" PKU1]test_unparse.pynu[import unittest from test import test_support import cStringIO import sys import os import tokenize import ast import unparse def read_pyfile(filename): """Read and return the contents of a Python source file (as a string), taking into account the file encoding.""" with open(filename, "r") as pyfile: source = pyfile.read() return source for_else = """\ def f(): for x in range(10): break else: y = 2 z = 3 """ while_else = """\ def g(): while True: break else: y = 2 z = 3 """ relative_import = """\ from . import fred from .. import barney from .australia import shrimp as prawns """ class_decorator = """\ @f1(arg) @f2 class Foo: pass """ elif1 = """\ if cond1: suite1 elif cond2: suite2 else: suite3 """ elif2 = """\ if cond1: suite1 elif cond2: suite2 """ try_except_finally = """\ try: suite1 except ex1: suite2 except ex2: suite3 else: suite4 finally: suite5 """ class ASTTestCase(unittest.TestCase): def assertASTEqual(self, ast1, ast2): dump1 = ast.dump(ast1) dump2 = ast.dump(ast2) self.assertEqual(ast.dump(ast1), ast.dump(ast2)) def check_roundtrip(self, code1, filename="internal"): ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST) unparse_buffer = cStringIO.StringIO() unparse.Unparser(ast1, unparse_buffer) code2 = unparse_buffer.getvalue() ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST) self.assertASTEqual(ast1, ast2) class UnparseTestCase(ASTTestCase): # Tests for specific bugs found in earlier versions of unparse def test_del_statement(self): self.check_roundtrip("del x, y, z") def test_shifts(self): self.check_roundtrip("45 << 2") self.check_roundtrip("13 >> 7") def test_for_else(self): self.check_roundtrip(for_else) def test_while_else(self): self.check_roundtrip(while_else) def test_unary_parens(self): self.check_roundtrip("(-1)**7") self.check_roundtrip("(-1.)**8") self.check_roundtrip("(-1j)**6") self.check_roundtrip("not True or False") self.check_roundtrip("True or not False") def test_integer_parens(self): self.check_roundtrip("3 .__abs__()") def test_huge_float(self): self.check_roundtrip("1e1000") self.check_roundtrip("-1e1000") self.check_roundtrip("1e1000j") self.check_roundtrip("-1e1000j") def test_min_int(self): self.check_roundtrip(str(-sys.maxint-1)) self.check_roundtrip("-(%s)" % (sys.maxint + 1)) def test_imaginary_literals(self): self.check_roundtrip("7j") self.check_roundtrip("-7j") self.check_roundtrip("-(7j)") self.check_roundtrip("0j") self.check_roundtrip("-0j") self.check_roundtrip("-(0j)") def test_negative_zero(self): self.check_roundtrip("-0") self.check_roundtrip("-(0)") self.check_roundtrip("-0b0") self.check_roundtrip("-(0b0)") self.check_roundtrip("-0o0") self.check_roundtrip("-(0o0)") self.check_roundtrip("-0x0") self.check_roundtrip("-(0x0)") def test_lambda_parentheses(self): self.check_roundtrip("(lambda: int)()") def test_chained_comparisons(self): self.check_roundtrip("1 < 4 <= 5") self.check_roundtrip("a is b is c is not d") def test_function_arguments(self): self.check_roundtrip("def f(): pass") self.check_roundtrip("def f(a): pass") self.check_roundtrip("def f(b = 2): pass") self.check_roundtrip("def f(a, b): pass") self.check_roundtrip("def f(a, b = 2): pass") self.check_roundtrip("def f(a = 5, b = 2): pass") self.check_roundtrip("def f(*args, **kwargs): pass") def test_relative_import(self): self.check_roundtrip(relative_import) def test_bytes(self): self.check_roundtrip("b'123'") def test_set_literal(self): self.check_roundtrip("{'a', 'b', 'c'}") def test_set_comprehension(self): self.check_roundtrip("{x for x in range(5)}") def test_dict_comprehension(self): self.check_roundtrip("{x: x*x for x in range(10)}") def test_class_decorators(self): self.check_roundtrip(class_decorator) def test_elifs(self): self.check_roundtrip(elif1) self.check_roundtrip(elif2) def test_try_except_finally(self): self.check_roundtrip(try_except_finally) class DirectoryTestCase(ASTTestCase): """Test roundtrip behaviour on all files in Lib and Lib/test.""" # test directories, relative to the root of the distribution test_directories = 'Lib', os.path.join('Lib', 'test') def test_files(self): # get names of files to test dist_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir) names = [] for d in self.test_directories: test_dir = os.path.join(dist_dir, d) for n in os.listdir(test_dir): if n.endswith('.py') and not n.startswith('bad'): names.append(os.path.join(test_dir, n)) for filename in names: if test_support.verbose: print('Testing %s' % filename) source = read_pyfile(filename) self.check_roundtrip(source) def test_main(): test_support.run_unittest(UnparseTestCase, DirectoryTestCase) if __name__ == '__main__': test_main() PKU1]n6test_parser.pynuȯ#! /usr/bin/python2.7 # (Force the script to use the latest build.) # # test_parser.py import parser, traceback _numFailed = 0 def testChunk(t, fileName): global _numFailed print '----', fileName, try: st = parser.suite(t) tup = parser.st2tuple(st) # this discards the first ST; a huge memory savings when running # against a large source file like Tkinter.py. st = None new = parser.tuple2st(tup) except parser.ParserError, err: print print 'parser module raised exception on input file', fileName + ':' traceback.print_exc() _numFailed = _numFailed + 1 else: if tup != parser.st2tuple(new): print print 'parser module failed on input file', fileName _numFailed = _numFailed + 1 else: print 'o.k.' def testFile(fileName): t = open(fileName).read() testChunk(t, fileName) def test(): import sys args = sys.argv[1:] if not args: import glob args = glob.glob("*.py") args.sort() map(testFile, args) sys.exit(_numFailed != 0) if __name__ == '__main__': test() PKU1]c simple.pyonu[ ^c@s dZdS(cCsdS(smaybe a docstringN((((s*/usr/lib64/python2.7/Demo/parser/simple.pytftN(R(((s*/usr/lib64/python2.7/Demo/parser/simple.pytRPKU1]G docstring.pynu["""Some documentation. """ PKU1]ɣ=]] unparse.pycnu[ ^c@sdZddlZddlZddlZddlZdeejjdZdZ dfdYZ ej dZ d Z d Zed kreejdndS( s'Usage: unparse.py iNt1eicCsZt|}y|t|Wntk r3n#Xx|D]}|||q;WdS(s<Call f on each item in seq, calling inter() in between. N(titertnextt StopIteration(tintertftseqtx((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt interleave s   tUnparsercBseZdZejdZddZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2id0d16d2d36d4d56d6d76Z3d8Z4i d4d96d6d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6Z5dOZ6i dPdQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6d^d_6d`da6dbdc6Z7ddZ8idee9j:6dfe9j;6Z<dgZ=dhZ>diZ?djZ@dkZAdlZBdmZCdnZDdoZEdpZFdqZGdrZHRS(ssMethods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarded. cCsI||_g|_d|_|j||jjd|jjdS(sTUnparser(tree, file=sys.stdout) -> None. Print the source for tree to file.itN(Rtfuture_importst_indenttdispatchtwritetflush(tselfttreetfile((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt__init__s     R cCs#|jjdd|j|dS(sBIndent a piece of text, according to the current indentation levels s N(RRR (Rttext((s+/usr/lib64/python2.7/Demo/parser/unparse.pytfill'scCs|jj|dS(s+Append a piece of text to the current line.N(RR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR+scCs |jd|jd7_dS(s(Print ':', and increase the indentation.t:iN(RR (R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytenter/s cCs|jd8_dS(sDecrease the indentation level.iN(R (R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytleave4scCsXt|tr1x|D]}|j|qWdSt|d|jj}||dS(s:Dispatcher function, dispatching tree type T to method _T.Nt_(t isinstancetlistR tgetattrt __class__t__name__(RRtttmeth((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR 8s  cCs%x|jD]}|j|q WdS(N(tbodyR (RRtstmt((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ModuleIscCs|j|j|jdS(N(RR tvalue(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExprNs cs0jdtfdj|jdS(Nsimport cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pytTR (RRR tnames(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ImportRs cs|jr8|jdkr8jjd|jDnjdjd|j|jruj|jnjdtfdj|jdS(Nt __future__css|]}|jVqdS(N(tname(t.0tn((s+/usr/lib64/python2.7/Demo/parser/unparse.pys Yssfrom t.s import cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&`R ( tmoduleR textendR'RRtlevelRR (RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ImportFromVs    cCsL|jx+|jD] }|j||jdqW|j|jdS(Ns = (RttargetsR RR$(RRttarget((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Assignbs   cCsS|j|j|j|jd|j|jjjd|j|jdS(Nt s= ( RR R3RtbinoptopRRR$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _AugAssignis %cCs:|jd|jr6|jd|j|jndS(NtreturnR5(RR$RR (RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Returnos   cCs|jddS(Ntpass(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_PassuscCs|jddS(Ntbreak(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BreakxscCs|jddS(Ntcontinue(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _Continue{scs0jdtfdj|jdS(Nsdel cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R (RRR R2(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Delete~s cCsJ|jd|j|j|jrF|jd|j|jndS(Nsassert s, (RR ttesttmsgR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Asserts    cCss|jd|j|j|jrF|jd|j|jn|jro|jd|j|jndS(Nsexec s in s, (RR R!tglobalsRtlocals(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Execs     cCs|jdt}|jrB|jd|j|jt}nx:|jD]/}|rh|jdnt}|j|qLW|js|jdndS(Nsprint s>>s, t,(RtFalsetdestRR tTruetvaluestnl(RRtdo_commate((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Prints     cs0jdtfdj|jdS(Nsglobal cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R (RRRR'(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Globals cCsT|jd|jd|jrC|jd|j|jn|jddS(Nt(tyieldR5t)(RR$R (RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Yields     cCs|jd|jr)|j|jn|jrR|jd|j|jn|jr{|jd|j|jndS(Nsraise s, (RttypeR tinstRttback(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Raises      cCs|jd|j|j|j|jx|jD]}|j|q;W|jr|jd|j|j|j|jndS(Nttrytelse(RRR R!Rthandlerstorelse(RRtex((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _TryExcepts      cCst|jdkrAt|jdtjrA|j|jn1|jd|j|j|j|j|jd|j|j|j |jdS(NiiRZtfinally( tlenR!Rtastt TryExceptR RRRt finalbody(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _TryFinallys.     cCs|jd|jr6|jd|j|jn|jr_|jd|j|jn|j|j|j|jdS(NtexceptR5s as (RRVRR R*RR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExceptHandlers      cCs|jdx+|jD] }|jd|j|qW|jd|j|jr|jdx+|jD] }|j||jdqoW|jdn|j|j|j|jdS(Ns t@sclass RRs, RT( Rtdecorator_listRR R*tbasesRR!R(RRtdecota((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ClassDefs      cCs|jdx+|jD] }|jd|j|qW|jd|jd|j|j|jd|j|j|j|jdS(Ns Rhsdef RRRT( RRiRR R*targsRR!R(RRRk((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _FunctionDefs    cCs|jd|j|j|jd|j|j|j|j|j|j|jr|jd|j|j|j|jndS(Nsfor s in R[( RR R3RRRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Fors       cCs|jd|j|j|j|j|j|jx|jrt|jdkrt|jdt j r|jd}|jd|j|j|j|j|j|jqDW|jr |jd|j|j|j|jndS(Nsif iiselif R[( RR RBRR!RR]RaRRbtIf(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_If s$   !      cCs|jd|j|j|j|j|j|j|jr~|jd|j|j|j|jndS(Nswhile R[(RR RBRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_While!s      cCsn|jd|j|j|jrF|jd|j|jn|j|j|j|jdS(Nswith s as (RR t context_exprt optional_varsRRR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_With-s    cCsd|jkr(|jt|jnut|jtrW|jdt|jnFt|jtr|jt|jjdntst ddS(Ntunicode_literalstbtusshouldn't get here( R RtreprtsRtstrtunicodetlstripRItAssertionError(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Str8s"cCs|j|jdS(N(Rtid(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NameEscCs.|jd|j|j|jddS(Nt`(RR R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ReprHs cCsjt|j}|jdr.|jdn|j|jdt|jdrf|jdndS(Nt-RRtinfRT(RzR,t startswithRtreplacetINFSTR(RRtrepr_n((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NumMs cs=jdtfdj|jjddS(Nt[cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&YR t](RRR telts(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ListWs cCsO|jd|j|jx|jD]}|j|q'W|jddS(NRR(RR teltt generators(RRtgen((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ListComp\s  cCsO|jd|j|jx|jD]}|j|q'W|jddS(NRRRT(RR RR(RRR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _GeneratorExpcs  cCsO|jd|j|jx|jD]}|j|q'W|jddS(Nt{t}(RR RR(RRR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_SetCompjs  cCsl|jd|j|j|jd|j|jx|jD]}|j|qDW|jddS(NRs: R(RR tkeyR$R(RRR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _DictCompqs  cCsl|jd|j|j|jd|j|jx+|jD] }|jd|j|qDWdS(Ns for s in s if (RR R3Rtifs(RRt if_clause((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_comprehensionzs   cCsh|jd|j|j|jd|j|j|jd|j|j|jddS(NRRs if s else RT(RR R!RBR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_IfExps   csL|jstjdtfdj|jjddS(NRcs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R R(RRRRR (RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Sets csUjdfd}tfd|t|j|jjddS(NRcs7|\}}j|jdj|dS(Ns: (R R(tpairtktv(R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyt write_pairs   cs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R R(RRtziptkeysRL(RRR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Dicts (cs{jdt|jdkrK|j\}j|jdntfdj|jjddS(NRRiRHcs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R RT(RRaRR R(RRR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Tuples   t~tInverttnottNott+tUAddRtUSubcCs|jd|j|j|jjj|jdt|jtjrt|jtj r|jd|j |j|jdn|j |j|jddS(NRRR5RT( RtunopR7RRRRbRtoperandtNumR (RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_UnaryOps  * tAddtSubt*tMultt/tDivt%tMods<>tRShiftt|tBitOrt^tBitXort&tBitAnds//tFloorDivs**tPowcCsc|jd|j|j|jd|j|jjjd|j|j|jddS(NRRR5RT(RR tleftR6R7RRtright(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BinOps  %s==tEqs!=tNotEqttGts>=tGtEtistIssis nottIsNottintInsnot intNotIncCs|jd|j|jxRt|j|jD];\}}|jd|j|jjd|j|q3W|jddS(NRRR5RT( RR RRtopst comparatorstcmpopsRR(RRtoRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Compares  ""tandtorcsWjddj|jjtfdj|jjddS(NRRs %s cs jS(N(R((R{R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&R RT(RtboolopsR7RRR RL(RR((R{Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BoolOps "cCsk|j|jt|jtjrJt|jjtrJ|jdn|jd|j|jdS(NR5R-( R R$RRbRR,tintRtattr(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _Attributes * cCs8|j|j|jdt}x:|jD]/}|rI|jdnt}|j|q-Wx:|jD]/}|r|jdnt}|j|qjW|jr|r|jdnt}|jd|j|jn|jr'|r|jdnt}|jd|j|jn|jddS(NRRs, Rs**RT( R tfuncRRIRnRKtkeywordststarargstkwargs(RRtcommaRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Calls4     cCs>|j|j|jd|j|j|jddS(NRR(R R$Rtslice(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _Subscripts cCs|jddS(Ns...(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _EllipsisscCs|j|jdS(N(R R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_IndexscCsr|jr|j|jn|jd|jrE|j|jn|jrn|jd|j|jndS(NR(tlowerR Rtuppertstep(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Slices     cs#tfdj|jdS(Ncs jdS(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR& R (RR tdims(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt _ExtSlice scCs't}dgt|jt|j|j}xot|j|D][\}}|r^t}n |jd|j|f|rC|jd|j|qCqCW|j r|rt}n |jd|jd|j|j n|j r#|rt}n |jd|jd|j ndS(Ns, t=Rs**( RKtNoneRaRntdefaultsRRIRR tvarargtkwarg(RRtfirstRRltd((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt _argumentss**          cCs1|j|j|jd|j|jdS(NR(RtargR R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_keyword)s cCsX|jd|jd|j|j|jd|j|j|jddS(NRRslambda s: RT(RR RnR!(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Lambda.s    cCs4|j|j|jr0|jd|jndS(Ns as (RR*tasname(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_alias6s (IRt __module__t__doc__tsyststdoutRRRRRR R#R%R(R1R4R8R:R<R>R@RARDRGRPRQRURYR_ReRgRmRoRpRrRsRvRRRRRRRRRRRRRRRRR6RRRRbtAndtOrRRRRRRRRRRRRR(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR s                                " &# -          cCsMt|d}|j}WdQXt||dtj}t||dS(Ntrtexec(topentreadtcompileRbt PyCF_ONLY_ASTR (tfilenametoutputtpyfiletsourceR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt roundtrip;scCsy5gtj|D]}|jdr|^q}Wn%tk r\tjjd|nXx|D]}tjj||}tjj |rt j }d|GHyt ||Wqt k r}dt|GHqXqdtjj|rdt|qdqdWdS(Ns.pysDirectory not readable: %ss Testing %ss$ Failed to compile, exception is %s(tostlistdirtendswithtOSErrorRtstderrRtpathtjointisfilet cStringIOtStringIORt ExceptionRztisdirttestdir(RlR,R'tfullnameR RO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyRCs5    cCsQ|ddkr2x:|dD]}t|qWnx|D]}t|q9WdS(Nis --testdiri(RR(RnRl((s+/usr/lib64/python2.7/Demo/parser/unparse.pytmainUs  t__main__(RRRbRRRzt float_infot max_10_expRRR RRRRRtargv(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyts     %   PKU1]$00 source.pyonu[ ^c@s&dZdddYZdZdS(sExmaple file to be parsed for the parsermodule example. The classes and functions in this module exist only to exhibit the ability of the handling information extraction from nested definitions using parse trees. They shouldn't interest you otherwise! tSimplecBs*eZdZdZdddYZRS(sThis class does very little.cCsdS(s This method does almost nothing.i((tself((s*/usr/lib64/python2.7/Demo/parser/source.pytmethod stNestedcBseZdZdZRS(sThis is a nested class.cCs d}|S(sMethod of Nested class.cSsdS(s#Function in method of Nested class.N((((s*/usr/lib64/python2.7/Demo/parser/source.pytnested_functions((RR((s*/usr/lib64/python2.7/Demo/parser/source.pyt nested_methods (t__name__t __module__t__doc__R(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs((RRRRR(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs cCsdS(s(This function lives at the module level.i((((s*/usr/lib64/python2.7/Demo/parser/source.pytfunctionsN((RRR (((s*/usr/lib64/python2.7/Demo/parser/source.pytsPKU1]y=ZZ example.pynu["""Simple code to extract class & function docstrings from a module. This code is used as an example in the library reference manual in the section on using the parser module. Refer to the manual for a thorough discussion of the operation of this code. """ import os import parser import symbol import token import types from types import ListType, TupleType def get_docs(fileName): """Retrieve information from the parse tree of a source file. fileName Name of the file to read Python source code from. """ source = open(fileName).read() basename = os.path.basename(os.path.splitext(fileName)[0]) ast = parser.suite(source) return ModuleInfo(ast.totuple(), basename) class SuiteInfoBase: _docstring = '' _name = '' def __init__(self, tree = None): self._class_info = {} self._function_info = {} if tree: self._extract_info(tree) def _extract_info(self, tree): # extract docstring if len(tree) == 2: found, vars = match(DOCSTRING_STMT_PATTERN[1], tree[1]) else: found, vars = match(DOCSTRING_STMT_PATTERN, tree[3]) if found: self._docstring = eval(vars['docstring']) # discover inner definitions for node in tree[1:]: found, vars = match(COMPOUND_STMT_PATTERN, node) if found: cstmt = vars['compound'] if cstmt[0] == symbol.funcdef: name = cstmt[2][1] self._function_info[name] = FunctionInfo(cstmt) elif cstmt[0] == symbol.classdef: name = cstmt[2][1] self._class_info[name] = ClassInfo(cstmt) def get_docstring(self): return self._docstring def get_name(self): return self._name def get_class_names(self): return self._class_info.keys() def get_class_info(self, name): return self._class_info[name] def __getitem__(self, name): try: return self._class_info[name] except KeyError: return self._function_info[name] class SuiteFuncInfo: # Mixin class providing access to function names and info. def get_function_names(self): return self._function_info.keys() def get_function_info(self, name): return self._function_info[name] class FunctionInfo(SuiteInfoBase, SuiteFuncInfo): def __init__(self, tree = None): self._name = tree[2][1] SuiteInfoBase.__init__(self, tree and tree[-1] or None) class ClassInfo(SuiteInfoBase): def __init__(self, tree = None): self._name = tree[2][1] SuiteInfoBase.__init__(self, tree and tree[-1] or None) def get_method_names(self): return self._function_info.keys() def get_method_info(self, name): return self._function_info[name] class ModuleInfo(SuiteInfoBase, SuiteFuncInfo): def __init__(self, tree = None, name = ""): self._name = name SuiteInfoBase.__init__(self, tree) if tree: found, vars = match(DOCSTRING_STMT_PATTERN, tree[1]) if found: self._docstring = vars["docstring"] def match(pattern, data, vars=None): """Match `data' to `pattern', with variable extraction. pattern Pattern to match against, possibly containing variables. data Data to be checked and against which variables are extracted. vars Dictionary of variables which have already been found. If not provided, an empty dictionary is created. The `pattern' value may contain variables of the form ['varname'] which are allowed to match anything. The value that is matched is returned as part of a dictionary which maps 'varname' to the matched value. 'varname' is not required to be a string object, but using strings makes patterns and the code which uses them more readable. This function returns two values: a boolean indicating whether a match was found and a dictionary mapping variable names to their associated values. """ if vars is None: vars = {} if type(pattern) is ListType: # 'variables' are ['varname'] vars[pattern[0]] = data return 1, vars if type(pattern) is not TupleType: return (pattern == data), vars if len(data) != len(pattern): return 0, vars for pattern, data in map(None, pattern, data): same, vars = match(pattern, data, vars) if not same: break return same, vars # This pattern identifies compound statements, allowing them to be readily # differentiated from simple statements. # COMPOUND_STMT_PATTERN = ( symbol.stmt, (symbol.compound_stmt, ['compound']) ) # This pattern will match a 'stmt' node which *might* represent a docstring; # docstrings require that the statement which provides the docstring be the # first statement in the class or function, which this pattern does not check. # DOCSTRING_STMT_PATTERN = ( symbol.stmt, (symbol.simple_stmt, (symbol.small_stmt, (symbol.expr_stmt, (symbol.testlist, (symbol.test, (symbol.and_test, (symbol.not_test, (symbol.comparison, (symbol.expr, (symbol.xor_expr, (symbol.and_expr, (symbol.shift_expr, (symbol.arith_expr, (symbol.term, (symbol.factor, (symbol.power, (symbol.atom, (token.STRING, ['docstring']) )))))))))))))))), (token.NEWLINE, '') )) PKU1]'njCjC unparse.pynu["Usage: unparse.py " import sys import ast import cStringIO import os # Large float and imaginary literals get turned into infinities in the AST. # We unparse those infinities to INFSTR. INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) def interleave(inter, f, seq): """Call f on each item in seq, calling inter() in between. """ seq = iter(seq) try: f(next(seq)) except StopIteration: pass else: for x in seq: inter() f(x) class Unparser: """Methods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarded. """ def __init__(self, tree, file = sys.stdout): """Unparser(tree, file=sys.stdout) -> None. Print the source for tree to file.""" self.f = file self.future_imports = [] self._indent = 0 self.dispatch(tree) self.f.write("") self.f.flush() def fill(self, text = ""): "Indent a piece of text, according to the current indentation level" self.f.write("\n"+" "*self._indent + text) def write(self, text): "Append a piece of text to the current line." self.f.write(text) def enter(self): "Print ':', and increase the indentation." self.write(":") self._indent += 1 def leave(self): "Decrease the indentation level." self._indent -= 1 def dispatch(self, tree): "Dispatcher function, dispatching tree type T to method _T." if isinstance(tree, list): for t in tree: self.dispatch(t) return meth = getattr(self, "_"+tree.__class__.__name__) meth(tree) ############### Unparsing methods ###################### # There should be one method per concrete grammar type # # Constructors should be grouped by sum type. Ideally, # # this would follow the order in the grammar, but # # currently doesn't. # ######################################################## def _Module(self, tree): for stmt in tree.body: self.dispatch(stmt) # stmt def _Expr(self, tree): self.fill() self.dispatch(tree.value) def _Import(self, t): self.fill("import ") interleave(lambda: self.write(", "), self.dispatch, t.names) def _ImportFrom(self, t): # A from __future__ import may affect unparsing, so record it. if t.module and t.module == '__future__': self.future_imports.extend(n.name for n in t.names) self.fill("from ") self.write("." * t.level) if t.module: self.write(t.module) self.write(" import ") interleave(lambda: self.write(", "), self.dispatch, t.names) def _Assign(self, t): self.fill() for target in t.targets: self.dispatch(target) self.write(" = ") self.dispatch(t.value) def _AugAssign(self, t): self.fill() self.dispatch(t.target) self.write(" "+self.binop[t.op.__class__.__name__]+"= ") self.dispatch(t.value) def _Return(self, t): self.fill("return") if t.value: self.write(" ") self.dispatch(t.value) def _Pass(self, t): self.fill("pass") def _Break(self, t): self.fill("break") def _Continue(self, t): self.fill("continue") def _Delete(self, t): self.fill("del ") interleave(lambda: self.write(", "), self.dispatch, t.targets) def _Assert(self, t): self.fill("assert ") self.dispatch(t.test) if t.msg: self.write(", ") self.dispatch(t.msg) def _Exec(self, t): self.fill("exec ") self.dispatch(t.body) if t.globals: self.write(" in ") self.dispatch(t.globals) if t.locals: self.write(", ") self.dispatch(t.locals) def _Print(self, t): self.fill("print ") do_comma = False if t.dest: self.write(">>") self.dispatch(t.dest) do_comma = True for e in t.values: if do_comma:self.write(", ") else:do_comma=True self.dispatch(e) if not t.nl: self.write(",") def _Global(self, t): self.fill("global ") interleave(lambda: self.write(", "), self.write, t.names) def _Yield(self, t): self.write("(") self.write("yield") if t.value: self.write(" ") self.dispatch(t.value) self.write(")") def _Raise(self, t): self.fill('raise ') if t.type: self.dispatch(t.type) if t.inst: self.write(", ") self.dispatch(t.inst) if t.tback: self.write(", ") self.dispatch(t.tback) def _TryExcept(self, t): self.fill("try") self.enter() self.dispatch(t.body) self.leave() for ex in t.handlers: self.dispatch(ex) if t.orelse: self.fill("else") self.enter() self.dispatch(t.orelse) self.leave() def _TryFinally(self, t): if len(t.body) == 1 and isinstance(t.body[0], ast.TryExcept): # try-except-finally self.dispatch(t.body) else: self.fill("try") self.enter() self.dispatch(t.body) self.leave() self.fill("finally") self.enter() self.dispatch(t.finalbody) self.leave() def _ExceptHandler(self, t): self.fill("except") if t.type: self.write(" ") self.dispatch(t.type) if t.name: self.write(" as ") self.dispatch(t.name) self.enter() self.dispatch(t.body) self.leave() def _ClassDef(self, t): self.write("\n") for deco in t.decorator_list: self.fill("@") self.dispatch(deco) self.fill("class "+t.name) if t.bases: self.write("(") for a in t.bases: self.dispatch(a) self.write(", ") self.write(")") self.enter() self.dispatch(t.body) self.leave() def _FunctionDef(self, t): self.write("\n") for deco in t.decorator_list: self.fill("@") self.dispatch(deco) self.fill("def "+t.name + "(") self.dispatch(t.args) self.write(")") self.enter() self.dispatch(t.body) self.leave() def _For(self, t): self.fill("for ") self.dispatch(t.target) self.write(" in ") self.dispatch(t.iter) self.enter() self.dispatch(t.body) self.leave() if t.orelse: self.fill("else") self.enter() self.dispatch(t.orelse) self.leave() def _If(self, t): self.fill("if ") self.dispatch(t.test) self.enter() self.dispatch(t.body) self.leave() # collapse nested ifs into equivalent elifs. while (t.orelse and len(t.orelse) == 1 and isinstance(t.orelse[0], ast.If)): t = t.orelse[0] self.fill("elif ") self.dispatch(t.test) self.enter() self.dispatch(t.body) self.leave() # final else if t.orelse: self.fill("else") self.enter() self.dispatch(t.orelse) self.leave() def _While(self, t): self.fill("while ") self.dispatch(t.test) self.enter() self.dispatch(t.body) self.leave() if t.orelse: self.fill("else") self.enter() self.dispatch(t.orelse) self.leave() def _With(self, t): self.fill("with ") self.dispatch(t.context_expr) if t.optional_vars: self.write(" as ") self.dispatch(t.optional_vars) self.enter() self.dispatch(t.body) self.leave() # expr def _Str(self, tree): # if from __future__ import unicode_literals is in effect, # then we want to output string literals using a 'b' prefix # and unicode literals with no prefix. if "unicode_literals" not in self.future_imports: self.write(repr(tree.s)) elif isinstance(tree.s, str): self.write("b" + repr(tree.s)) elif isinstance(tree.s, unicode): self.write(repr(tree.s).lstrip("u")) else: assert False, "shouldn't get here" def _Name(self, t): self.write(t.id) def _Repr(self, t): self.write("`") self.dispatch(t.value) self.write("`") def _Num(self, t): repr_n = repr(t.n) # Parenthesize negative numbers, to avoid turning (-1)**2 into -1**2. if repr_n.startswith("-"): self.write("(") # Substitute overflowing decimal literal for AST infinities. self.write(repr_n.replace("inf", INFSTR)) if repr_n.startswith("-"): self.write(")") def _List(self, t): self.write("[") interleave(lambda: self.write(", "), self.dispatch, t.elts) self.write("]") def _ListComp(self, t): self.write("[") self.dispatch(t.elt) for gen in t.generators: self.dispatch(gen) self.write("]") def _GeneratorExp(self, t): self.write("(") self.dispatch(t.elt) for gen in t.generators: self.dispatch(gen) self.write(")") def _SetComp(self, t): self.write("{") self.dispatch(t.elt) for gen in t.generators: self.dispatch(gen) self.write("}") def _DictComp(self, t): self.write("{") self.dispatch(t.key) self.write(": ") self.dispatch(t.value) for gen in t.generators: self.dispatch(gen) self.write("}") def _comprehension(self, t): self.write(" for ") self.dispatch(t.target) self.write(" in ") self.dispatch(t.iter) for if_clause in t.ifs: self.write(" if ") self.dispatch(if_clause) def _IfExp(self, t): self.write("(") self.dispatch(t.body) self.write(" if ") self.dispatch(t.test) self.write(" else ") self.dispatch(t.orelse) self.write(")") def _Set(self, t): assert(t.elts) # should be at least one element self.write("{") interleave(lambda: self.write(", "), self.dispatch, t.elts) self.write("}") def _Dict(self, t): self.write("{") def write_pair(pair): (k, v) = pair self.dispatch(k) self.write(": ") self.dispatch(v) interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values)) self.write("}") def _Tuple(self, t): self.write("(") if len(t.elts) == 1: (elt,) = t.elts self.dispatch(elt) self.write(",") else: interleave(lambda: self.write(", "), self.dispatch, t.elts) self.write(")") unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"} def _UnaryOp(self, t): self.write("(") self.write(self.unop[t.op.__class__.__name__]) self.write(" ") # If we're applying unary minus to a number, parenthesize the number. # This is necessary: -2147483648 is different from -(2147483648) on # a 32-bit machine (the first is an int, the second a long), and # -7j is different from -(7j). (The first has real part 0.0, the second # has real part -0.0.) if isinstance(t.op, ast.USub) and isinstance(t.operand, ast.Num): self.write("(") self.dispatch(t.operand) self.write(")") else: self.dispatch(t.operand) self.write(")") binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%", "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&", "FloorDiv":"//", "Pow": "**"} def _BinOp(self, t): self.write("(") self.dispatch(t.left) self.write(" " + self.binop[t.op.__class__.__name__] + " ") self.dispatch(t.right) self.write(")") cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=", "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"} def _Compare(self, t): self.write("(") self.dispatch(t.left) for o, e in zip(t.ops, t.comparators): self.write(" " + self.cmpops[o.__class__.__name__] + " ") self.dispatch(e) self.write(")") boolops = {ast.And: 'and', ast.Or: 'or'} def _BoolOp(self, t): self.write("(") s = " %s " % self.boolops[t.op.__class__] interleave(lambda: self.write(s), self.dispatch, t.values) self.write(")") def _Attribute(self,t): self.dispatch(t.value) # Special case: 3.__abs__() is a syntax error, so if t.value # is an integer literal then we need to either parenthesize # it or add an extra space to get 3 .__abs__(). if isinstance(t.value, ast.Num) and isinstance(t.value.n, int): self.write(" ") self.write(".") self.write(t.attr) def _Call(self, t): self.dispatch(t.func) self.write("(") comma = False for e in t.args: if comma: self.write(", ") else: comma = True self.dispatch(e) for e in t.keywords: if comma: self.write(", ") else: comma = True self.dispatch(e) if t.starargs: if comma: self.write(", ") else: comma = True self.write("*") self.dispatch(t.starargs) if t.kwargs: if comma: self.write(", ") else: comma = True self.write("**") self.dispatch(t.kwargs) self.write(")") def _Subscript(self, t): self.dispatch(t.value) self.write("[") self.dispatch(t.slice) self.write("]") # slice def _Ellipsis(self, t): self.write("...") def _Index(self, t): self.dispatch(t.value) def _Slice(self, t): if t.lower: self.dispatch(t.lower) self.write(":") if t.upper: self.dispatch(t.upper) if t.step: self.write(":") self.dispatch(t.step) def _ExtSlice(self, t): interleave(lambda: self.write(', '), self.dispatch, t.dims) # others def _arguments(self, t): first = True # normal arguments defaults = [None] * (len(t.args) - len(t.defaults)) + t.defaults for a,d in zip(t.args, defaults): if first:first = False else: self.write(", ") self.dispatch(a), if d: self.write("=") self.dispatch(d) # varargs if t.vararg: if first:first = False else: self.write(", ") self.write("*") self.write(t.vararg) # kwargs if t.kwarg: if first:first = False else: self.write(", ") self.write("**"+t.kwarg) def _keyword(self, t): self.write(t.arg) self.write("=") self.dispatch(t.value) def _Lambda(self, t): self.write("(") self.write("lambda ") self.dispatch(t.args) self.write(": ") self.dispatch(t.body) self.write(")") def _alias(self, t): self.write(t.name) if t.asname: self.write(" as "+t.asname) def roundtrip(filename, output=sys.stdout): with open(filename, "r") as pyfile: source = pyfile.read() tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST) Unparser(tree, output) def testdir(a): try: names = [n for n in os.listdir(a) if n.endswith('.py')] except OSError: sys.stderr.write("Directory not readable: %s" % a) else: for n in names: fullname = os.path.join(a, n) if os.path.isfile(fullname): output = cStringIO.StringIO() print 'Testing %s' % fullname try: roundtrip(fullname, output) except Exception as e: print ' Failed to compile, exception is %s' % repr(e) elif os.path.isdir(fullname): testdir(fullname) def main(args): if args[0] == '--testdir': for a in args[1:]: testdir(a) else: for a in args: roundtrip(a) if __name__=='__main__': main(sys.argv[1:]) PKU1]$00 source.pycnu[ ^c@s&dZdddYZdZdS(sExmaple file to be parsed for the parsermodule example. The classes and functions in this module exist only to exhibit the ability of the handling information extraction from nested definitions using parse trees. They shouldn't interest you otherwise! tSimplecBs*eZdZdZdddYZRS(sThis class does very little.cCsdS(s This method does almost nothing.i((tself((s*/usr/lib64/python2.7/Demo/parser/source.pytmethod stNestedcBseZdZdZRS(sThis is a nested class.cCs d}|S(sMethod of Nested class.cSsdS(s#Function in method of Nested class.N((((s*/usr/lib64/python2.7/Demo/parser/source.pytnested_functions((RR((s*/usr/lib64/python2.7/Demo/parser/source.pyt nested_methods (t__name__t __module__t__doc__R(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs((RRRRR(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs cCsdS(s(This function lives at the module level.i((((s*/usr/lib64/python2.7/Demo/parser/source.pytfunctionsN((RRR (((s*/usr/lib64/python2.7/Demo/parser/source.pytsPKU1]0test_parser.pyonu[PKU1]rX docstring.pyonu[PKU1]g$$ example.pycnu[PKU1]9\n]n] -#unparse.pyonu[PKU1]0րtest_parser.pycnu[PKU1]64?!!test_unparse.pyonu[PKU1]64?!!ƨtest_unparse.pycnu[PKU1]GjD source.pynu[PKU1]^READMEnu[PKU1]c .simple.pycnu[PKU1]rX docstring.pycnu[PKU1]g$$ kexample.pyonu[PKU1]Nk[[FILESnu[PKU1]qϭ Zsimple.pynu[PKU1]test_unparse.pynu[PKU1]n6test_parser.pynuȯPKU1]c  simple.pyonu[PKU1]G  docstring.pynu[PKU1]ɣ=]] 7unparse.pycnu[PKU1]$00 7lsource.pyonu[PKU1]y=ZZ rexample.pynu[PKU1]'njCjC 5unparse.pynu[PKU1]$00 source.pycnu[PKC