Index: example.py =================================================================== --- example.py (revision 61574) +++ example.py (working copy) @@ -362,5 +362,7 @@ def buffer_examples(): x = buffer(y) +def sys_exc_examples(): + print sys.exc_type, sys.exc_value, sys.exc_traceback # This is the last line. Index: lib2to3/tests/test_fixers.py =================================================================== --- lib2to3/tests/test_fixers.py (revision 61574) +++ lib2to3/tests/test_fixers.py (working copy) @@ -2912,7 +2912,24 @@ a = """ itertools.filterfalse(a, b)""" self.check(b, a) +class Test_sys_exc(FixerTestCase): + fixer = "sys_exc" + def test_0(self): + b = "sys.exc_type" + a = "sys.exc_info()[0]" + self.check(b, a) + + def test_1(self): + b = "sys.exc_value" + a = "sys.exc_info()[1]" + self.check(b, a) + + def test_2(self): + b = "sys.exc_traceback" + a = "sys.exc_info()[2]" + self.check(b, a) + if __name__ == "__main__": import __main__ support.run_all_tests(__main__) Index: lib2to3/fixes/fix_sys_exc.py =================================================================== --- lib2to3/fixes/fix_sys_exc.py (revision 0) +++ lib2to3/fixes/fix_sys_exc.py (revision 0) @@ -0,0 +1,25 @@ +"""Fixer for sys.exc_{type, value, traceback} + +sys.exc_type -> sys.exc_info()[0] +sys.exc_value -> sys.exc_info()[1] +sys.exc_traceback -> sys.exc_info()[2] +""" + +# Local imports +from . import basefix +from .util import Attr, Call, Name, Number, Subscript, Node, syms + +class FixSysExc(basefix.BaseFix): + # This order matches the ordering of sys.exc_info(). + exc_info = ["exc_type", "exc_value", "exc_traceback"] + PATTERN = """ + power< 'sys' trailer< '.' method=(%s)>> + """ % '|'.join("'%s'" % e for e in exc_info) + + def transform(self, node, results): + method = results["method"][0] + index = Number(self.exc_info.index(method.value)) + + exc = Attr(Name("sys"), Call(Name("exc_info"))) + exc.append(Subscript(index)) + return Node(syms.power, exc, prefix=node.get_prefix())