| Viewing file:  fix_throw.py (1.55 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
"""Fixer for generator.throw(E, V, T).
 g.throw(E)       -> g.throw(E)
 g.throw(E, V)    -> g.throw(E(V))
 g.throw(E, V, T) -> g.throw(E(V).with_traceback(T))
 
 g.throw("foo"[, V[, T]]) will warn about string exceptions."""
 # Author: Collin Winter
 
 # Local imports
 from .. import pytree
 from ..pgen2 import token
 from .. import fixer_base
 from ..fixer_util import Name, Call, ArgList, Attr, is_tuple
 
 class FixThrow(fixer_base.BaseFix):
 BM_compatible = True
 PATTERN = """
 power< any trailer< '.' 'throw' >
 trailer< '(' args=arglist< exc=any ',' val=any [',' tb=any] > ')' >
 >
 |
 power< any trailer< '.' 'throw' > trailer< '(' exc=any ')' > >
 """
 
 def transform(self, node, results):
 syms = self.syms
 
 exc = results["exc"].clone()
 if exc.type is token.STRING:
 self.cannot_convert(node, "Python 3 does not support string exceptions")
 return
 
 # Leave "g.throw(E)" alone
 val = results.get(u"val")
 if val is None:
 return
 
 val = val.clone()
 if is_tuple(val):
 args = [c.clone() for c in val.children[1:-1]]
 else:
 val.prefix = u""
 args = [val]
 
 throw_args = results["args"]
 
 if "tb" in results:
 tb = results["tb"].clone()
 tb.prefix = u""
 
 e = Call(exc, args)
 with_tb = Attr(e, Name(u'with_traceback')) + [ArgList([tb])]
 throw_args.replace(pytree.Node(syms.power, with_tb))
 else:
 throw_args.replace(Call(exc, args))
 
 |