j f@sdZddlmZddlmZddlmZddlmZmZm Z m Z m Z m Z ddZ Gdd d ejZd d Zd d ZgdddZddZdS)a:Fixer for function definitions with tuple parameters. def func(((a, b), c), d): ... -> def func(x, d): ((a, b), c) = x ... It will also support lambdas: lambda (x, y): x + y -> lambda t: t[0] + t[1] # The parens are a syntax error in Python 3 lambda (x): x + y -> lambda x: x + y )pytree)token) fixer_base)AssignNameNewlineNumber SubscriptsymscCs)t|tjo(|jdjtjkS)N) isinstancerNodechildrentyperSTRING)stmtrC/opt/alt/python34/lib64/python3.4/lib2to3/fixes/fix_tuple_params.py is_docstringsrc@s:eZdZdZdZdZddZddZdS) FixTupleParamsTa funcdef< 'def' any parameters< '(' args=any ')' > ['->' any] ':' suite=any+ > | lambda= lambdef< 'lambda' args=vfpdef< '(' inner=any ')' > ':' body=any > c s6d|krj||Sg|d}|d}|djdjtjkryd}|djdj}tn!d}d}tjtjdd fd d }|jt j kr||n`|jt j kr4xKt |jD]7\}} | jt j kr|| d |dkqqWns>dSxD]} |d| _ qEW|} |dkr~d d_n1t|dj|r|d_|d} nxD]} |d| _ qW|dj| | .handle_tupler"r)transform_lambdarrrINDENTvaluerrZLeafr ZtfpdefZ typedargslist enumerateparentrrrangelenZchanged) r'noderesultsrrstartindentr(ir$lineafterr)r%r&r'r transform.sF            (zFixTupleParams.transformc CsB|d}|d}t|d}|jtjkr\|j}d|_|j|dSt|}t|}|j t |}t |dd} |j| jx|j D]} | jtjkr| j |krdd|| j D} tjtj| jg| } | j| _| j| qqWdS)NrbodyinnerrrcSsg|]}|jqSr)r).0crrr s z3FixTupleParams.transform_lambda..) simplify_argsrrNAMErrr find_params map_to_indexr tuple_namerZ post_orderr+rr r Zpower) r'r0r1rr8r9ZparamsZto_indexZtup_nameZ new_paramr#Z subscriptsnewrrrr)ns(       !  zFixTupleParams.transform_lambdaN)__name__ __module__ __qualname__Z run_orderZ BM_compatibleZPATTERNr7r)rrrrrs   @rcCso|jtjtjfkr|S|jtjkr[x#|jtjkrV|jd}q4W|Std|dS)NrzReceived unexpected node %s)rr Zvfplistrr>vfpdefr RuntimeError)r0rrrr=sr=cCsP|jtjkr#t|jdS|jtjkr<|jSdd|jDS)NrcSs.g|]$}|jtjkrt|qSr)rrCOMMAr?)r:r;rrrr<s zfind_params..)rr rFr?rrr>r+)r0rrrr?s r?NcCs|dkri}nxht|D]Z\}}ttt|g}t|trnt||d|q"||||s. l