home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / ast.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  6.7 KB  |  203 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. from _ast import *
  5. from _ast import __version__
  6.  
  7. def parse(expr, filename = '<unknown>', mode = 'exec'):
  8.     return compile(expr, filename, mode, PyCF_ONLY_AST)
  9.  
  10.  
  11. def literal_eval(node_or_string):
  12.     _safe_names = {
  13.         'None': None,
  14.         'True': True,
  15.         'False': False }
  16.     if isinstance(node_or_string, basestring):
  17.         node_or_string = parse(node_or_string, mode = 'eval')
  18.     if isinstance(node_or_string, Expression):
  19.         node_or_string = node_or_string.body
  20.     
  21.     def _convert(node):
  22.         if isinstance(node, Str):
  23.             return node.s
  24.         if None(node, Num):
  25.             return node.n
  26.         if None(node, Tuple):
  27.             return tuple(map(_convert, node.elts))
  28.         if None(node, List):
  29.             return list(map(_convert, node.elts))
  30.         if None(node, Dict):
  31.             return (dict,)((lambda .0: pass)(zip(node.keys, node.values)))
  32.         if None(node, Name) or node.id in _safe_names:
  33.             return _safe_names[node.id]
  34.         if isinstance(node, BinOp) and isinstance(node.op, (Add, Sub)) and isinstance(node.right, Num) and isinstance(node.right.n, complex) and isinstance(node.left, Num) and isinstance(node.left.n, (int, long, float)):
  35.             left = node.left.n
  36.             right = node.right.n
  37.             if isinstance(node.op, Add):
  38.                 return left + right
  39.             return None - right
  40.         raise ValueError('malformed string')
  41.  
  42.     return _convert(node_or_string)
  43.  
  44.  
  45. def dump(node, annotate_fields = True, include_attributes = False):
  46.     
  47.     def _format(node):
  48.         if isinstance(node, AST):
  49.             fields = [ (a, _format(b)) for a, b in iter_fields(node) ]
  50.             rv = '%s(%s' % (node.__class__.__name__, ', '.join((lambda .0: pass)(fields) if annotate_fields else (lambda .0: pass)(fields)))
  51.             if include_attributes and node._attributes:
  52.                 if not fields or ', ':
  53.                     pass
  54.                 rv += ' '
  55.                 None += (rv, ', '.join)((lambda .0: pass)(node._attributes))
  56.             return rv + ')'
  57.         if None(node, list):
  58.             return '[%s]' % (', '.join,)((lambda .0: pass)(node))
  59.         return None(node)
  60.  
  61.     if not isinstance(node, AST):
  62.         raise TypeError('expected AST, got %r' % node.__class__.__name__)
  63.     return _format(node)
  64.  
  65.  
  66. def copy_location(new_node, old_node):
  67.     for attr in ('lineno', 'col_offset'):
  68.         if attr in old_node._attributes and attr in new_node._attributes and hasattr(old_node, attr):
  69.             setattr(new_node, attr, getattr(old_node, attr))
  70.             continue
  71.     return new_node
  72.  
  73.  
  74. def fix_missing_locations(node):
  75.     
  76.     def _fix(node, lineno, col_offset):
  77.         if 'lineno' in node._attributes:
  78.             if not hasattr(node, 'lineno'):
  79.                 node.lineno = lineno
  80.             else:
  81.                 lineno = node.lineno
  82.         if 'col_offset' in node._attributes:
  83.             if not hasattr(node, 'col_offset'):
  84.                 node.col_offset = col_offset
  85.             else:
  86.                 col_offset = node.col_offset
  87.         for child in iter_child_nodes(node):
  88.             _fix(child, lineno, col_offset)
  89.         
  90.  
  91.     _fix(node, 1, 0)
  92.     return node
  93.  
  94.  
  95. def increment_lineno(node, n = 1):
  96.     if 'lineno' in node._attributes:
  97.         node.lineno = getattr(node, 'lineno', 0) + n
  98.     for child in walk(node):
  99.         if 'lineno' in child._attributes:
  100.             child.lineno = getattr(child, 'lineno', 0) + n
  101.             continue
  102.     return node
  103.  
  104.  
  105. def iter_fields(node):
  106.     for field in node._fields:
  107.         
  108.         try:
  109.             yield (field, getattr(node, field))
  110.         continue
  111.         except AttributeError:
  112.             continue
  113.         
  114.  
  115.     
  116.  
  117.  
  118. def iter_child_nodes(node):
  119.     for name, field in iter_fields(node):
  120.         if isinstance(field, AST):
  121.             yield field
  122.             continue
  123.         if isinstance(field, list):
  124.             for item in field:
  125.                 if isinstance(item, AST):
  126.                     yield item
  127.                     continue
  128.             return None
  129.  
  130.  
  131. def get_docstring(node, clean = True):
  132.     if not isinstance(node, (FunctionDef, ClassDef, Module)):
  133.         raise TypeError("%r can't have docstrings" % node.__class__.__name__)
  134.     if node.body and isinstance(node.body[0], Expr) and isinstance(node.body[0].value, Str):
  135.         if clean:
  136.             import inspect
  137.             return inspect.cleandoc(node.body[0].value.s)
  138.         return None.body[0].value.s
  139.  
  140.  
  141. def walk(node):
  142.     deque = deque
  143.     import collections
  144.     todo = deque([
  145.         node])
  146.     while todo:
  147.         node = todo.popleft()
  148.         todo.extend(iter_child_nodes(node))
  149.         yield node
  150.  
  151.  
  152. class NodeVisitor(object):
  153.     
  154.     def visit(self, node):
  155.         method = 'visit_' + node.__class__.__name__
  156.         visitor = getattr(self, method, self.generic_visit)
  157.         return visitor(node)
  158.  
  159.     
  160.     def generic_visit(self, node):
  161.         for field, value in iter_fields(node):
  162.             if isinstance(value, list):
  163.                 for item in value:
  164.                     if isinstance(item, AST):
  165.                         self.visit(item)
  166.                         continue
  167.                     if isinstance(value, AST):
  168.                         self.visit(value)
  169.                         continue
  170.                     return None
  171.  
  172.  
  173.  
  174. class NodeTransformer(NodeVisitor):
  175.     
  176.     def generic_visit(self, node):
  177.         for field, old_value in iter_fields(node):
  178.             old_value = getattr(node, field, None)
  179.             if isinstance(old_value, list):
  180.                 new_values = []
  181.                 for value in old_value:
  182.                     if isinstance(value, AST):
  183.                         value = self.visit(value)
  184.                         if value is None:
  185.                             continue
  186.                         elif not isinstance(value, AST):
  187.                             new_values.extend(value)
  188.                             continue
  189.                         
  190.                     new_values.append(value)
  191.                 
  192.                 old_value[:] = new_values
  193.                 continue
  194.             if isinstance(old_value, AST):
  195.                 new_node = self.visit(old_value)
  196.                 if new_node is None:
  197.                     delattr(node, field)
  198.                 else:
  199.                     setattr(node, field, new_node)
  200.         return node
  201.  
  202.  
  203.