home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / lib2to3 / fixes / fix_tuple_params.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  5.3 KB  |  164 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''Fixer for function definitions with tuple parameters.
  5.  
  6. def func(((a, b), c), d):
  7.     ...
  8.  
  9.     ->
  10.  
  11. def func(x, d):
  12.     ((a, b), c) = x
  13.     ...
  14.  
  15. It will also support lambdas:
  16.  
  17.     lambda (x, y): x + y -> lambda t: t[0] + t[1]
  18.  
  19.     # The parens are a syntax error in Python 3
  20.     lambda (x): x + y -> lambda x: x + y
  21. '''
  22. from  import pytree
  23. from pgen2 import token
  24. from  import fixer_base
  25. from fixer_util import Assign, Name, Newline, Number, Subscript, syms
  26.  
  27. def is_docstring(stmt):
  28.     if isinstance(stmt, pytree.Node):
  29.         pass
  30.     return stmt.children[0].type == token.STRING
  31.  
  32.  
  33. class FixTupleParams(fixer_base.BaseFix):
  34.     PATTERN = "\n              funcdef< 'def' any parameters< '(' args=any ')' >\n                       ['->' any] ':' suite=any+ >\n              |\n              lambda=\n              lambdef< 'lambda' args=vfpdef< '(' inner=any ')' >\n                       ':' body=any\n              >\n              "
  35.     
  36.     def transform(self, node, results):
  37.         if 'lambda' in results:
  38.             return self.transform_lambda(node, results)
  39.         new_lines = []
  40.         suite = results['suite']
  41.         args = results['args']
  42.         if suite[0].children[1].type == token.INDENT:
  43.             start = 2
  44.             indent = suite[0].children[1].value
  45.             end = Newline()
  46.         else:
  47.             start = 0
  48.             indent = '; '
  49.             end = pytree.Leaf(token.INDENT, '')
  50.         
  51.         def handle_tuple(tuple_arg, add_prefix = (None, None, False)):
  52.             n = Name(self.new_name())
  53.             arg = tuple_arg.clone()
  54.             arg.set_prefix('')
  55.             stmt = Assign(arg, n.clone())
  56.             if add_prefix:
  57.                 n.set_prefix(' ')
  58.             
  59.             tuple_arg.replace(n)
  60.             new_lines.append(pytree.Node(syms.simple_stmt, [
  61.                 stmt,
  62.                 end.clone()]))
  63.  
  64.         if args.type == syms.tfpdef:
  65.             handle_tuple(args)
  66.         elif args.type == syms.typedargslist:
  67.             for i, arg in enumerate(args.children):
  68.                 if arg.type == syms.tfpdef:
  69.                     handle_tuple(arg, add_prefix = i > 0)
  70.                     continue
  71.             
  72.         
  73.         if not new_lines:
  74.             return node
  75.         for line in new_lines:
  76.             line.parent = suite[0]
  77.         
  78.         after = start
  79.         if start == 0:
  80.             new_lines[0].set_prefix(' ')
  81.         elif is_docstring(suite[0].children[start]):
  82.             new_lines[0].set_prefix(indent)
  83.             after = start + 1
  84.         
  85.         suite[0].children[after:after] = new_lines
  86.         for i in range(after + 1, after + len(new_lines) + 1):
  87.             suite[0].children[i].set_prefix(indent)
  88.         
  89.         suite[0].changed()
  90.  
  91.     
  92.     def transform_lambda(self, node, results):
  93.         args = results['args']
  94.         body = results['body']
  95.         inner = simplify_args(results['inner'])
  96.         if inner.type == token.NAME:
  97.             inner = inner.clone()
  98.             inner.set_prefix(' ')
  99.             args.replace(inner)
  100.             return None
  101.         params = find_params(args)
  102.         to_index = map_to_index(params)
  103.         tup_name = self.new_name(tuple_name(params))
  104.         new_param = Name(tup_name, prefix = ' ')
  105.         args.replace(new_param.clone())
  106.         for n in body.post_order():
  107.             if n.type == token.NAME and n.value in to_index:
  108.                 subscripts = [ c.clone() for c in to_index[n.value] ]
  109.                 new = pytree.Node(syms.power, [
  110.                     new_param.clone()] + subscripts)
  111.                 new.set_prefix(n.get_prefix())
  112.                 n.replace(new)
  113.                 continue
  114.             []
  115.         
  116.  
  117.  
  118.  
  119. def simplify_args(node):
  120.     if node.type in (syms.vfplist, token.NAME):
  121.         return node
  122.     if node.type == syms.vfpdef:
  123.         while node.type == syms.vfpdef:
  124.             node = node.children[1]
  125.             continue
  126.             node.type in (syms.vfplist, token.NAME)
  127.         return node
  128.     raise RuntimeError('Received unexpected node %s' % node)
  129.  
  130.  
  131. def find_params(node):
  132.     if node.type == syms.vfpdef:
  133.         return find_params(node.children[1])
  134.     if node.type == token.NAME:
  135.         return node.value
  136.     return _[1]
  137.  
  138.  
  139. def map_to_index(param_list, prefix = [], d = None):
  140.     if d is None:
  141.         d = { }
  142.     
  143.     for i, obj in enumerate(param_list):
  144.         trailer = [
  145.             Subscript(Number(i))]
  146.         if isinstance(obj, list):
  147.             map_to_index(obj, trailer, d = d)
  148.             continue
  149.         d[obj] = prefix + trailer
  150.     
  151.     return d
  152.  
  153.  
  154. def tuple_name(param_list):
  155.     l = []
  156.     for obj in param_list:
  157.         if isinstance(obj, list):
  158.             l.append(tuple_name(obj))
  159.             continue
  160.         l.append(obj)
  161.     
  162.     return '_'.join(l)
  163.  
  164.