--- src/RestrictedPython/Eval.py.orig	2010-07-09 04:28:54 UTC
+++ src/RestrictedPython/Eval.py
@@ -60,10 +60,10 @@ class RestrictionCapableEval:
                 self.expr, '<string>')
             if PROFILE:
                 end = clock()
-                print 'prepRestrictedCode: %d ms for %s' % (
-                    (end - start) * 1000, `self.expr`)
+                print('prepRestrictedCode: %d ms for %s' % (
+                    (end - start) * 1000, repr(self.expr)))
             if err:
-                raise SyntaxError, err[0]
+                raise SyntaxError(err[0])
             self.used = tuple(used.keys())
             self.rcode = co
 
--- src/RestrictedPython/Guards.py.orig	2010-07-09 04:07:16 UTC
+++ src/RestrictedPython/Guards.py
@@ -98,7 +98,7 @@ def _write_wrapper():
             try:
                 f = getattr(self.ob, secattr)
             except AttributeError:
-                raise TypeError, error_msg
+                raise TypeError(error_msg)
             f(*args)
         return handler
     class Wrapper:
--- src/RestrictedPython/Limits.py.orig	2010-07-07 14:42:56 UTC
+++ src/RestrictedPython/Limits.py
@@ -25,22 +25,22 @@ def limited_range(iFirst, *args):
     elif len(args) == 2:
         iStart, iEnd, iStep = iFirst, args[0], args[1]
     else:
-        raise AttributeError, 'range() requires 1-3 int arguments'
-    if iStep == 0: raise ValueError, 'zero step for range()'
+        raise AttributeError('range() requires 1-3 int arguments')
+    if iStep == 0: raise ValueError('zero step for range()')
     iLen = int((iEnd - iStart) / iStep)
     if iLen < 0: iLen = 0
-    if iLen >= RANGELIMIT: raise ValueError, 'range() too large'
-    return range(iStart, iEnd, iStep)
+    if iLen >= RANGELIMIT: raise ValueError('range() too large')
+    return list(range(iStart, iEnd, iStep))
 limited_builtins['range'] = limited_range
 
 def limited_list(seq):
     if isinstance(seq, str):
-        raise TypeError, 'cannot convert string to list'
+        raise TypeError('cannot convert string to list')
     return list(seq)
 limited_builtins['list'] = limited_list
 
 def limited_tuple(seq):
     if isinstance(seq, str):
-        raise TypeError, 'cannot convert string to tuple'
+        raise TypeError('cannot convert string to tuple')
     return tuple(seq)
 limited_builtins['tuple'] = limited_tuple
--- src/RestrictedPython/RCompile.py.orig	2010-07-07 14:42:56 UTC
+++ src/RestrictedPython/RCompile.py
@@ -20,12 +20,12 @@ from compiler import ast, parse, misc, syntax, pycodeg
 from compiler.pycodegen import AbstractCompileMode, Expression, \
      Interactive, Module, ModuleCodeGenerator, FunctionCodeGenerator, findOp
 
-import MutatingWalker
-from RestrictionMutator import RestrictionMutator
+from . import MutatingWalker
+from .RestrictionMutator import RestrictionMutator
 
 
 def niceParse(source, filename, mode):
-    if isinstance(source, unicode):
+    if isinstance(source, str):
         # Use the utf-8-sig BOM so the compiler
         # detects this as a UTF-8 encoded string.
         source = '\xef\xbb\xbf' + source.encode('utf-8')
@@ -58,7 +58,7 @@ class RestrictedCompileMode(AbstractCompileMode):
         tree = self.parse()
         MutatingWalker.walk(tree, self.rm)
         if self.rm.errors:
-            raise SyntaxError, self.rm.errors[0]
+            raise SyntaxError(self.rm.errors[0])
         misc.set_filename(self.filename, tree)
         syntax.check(tree)
         return tree
@@ -72,7 +72,7 @@ class RestrictedCompileMode(AbstractCompileMode):
 def compileAndTuplize(gen):
     try:
         gen.compile()
-    except SyntaxError, v:
+    except SyntaxError as v:
         return None, (str(v),), gen.rm.warnings, gen.rm.used_names
     return gen.getCode(), (), gen.rm.warnings, gen.rm.used_names
 
--- src/RestrictedPython/tests/before_and_after.py.orig	2010-07-09 04:29:10 UTC
+++ src/RestrictedPython/tests/before_and_after.py
@@ -77,11 +77,11 @@ def nested_list_comprehension_after():
 # print
 
 def simple_print_before():
-    print "foo"
+    print("foo")
 
 def simple_print_after():
     _print = _print_()
-    print >> _print, "foo"
+    print("foo", file=_print)
 
 # getitem
 
@@ -117,13 +117,13 @@ def simple_delitem_after():
 
 def function_with_print_before():
     def foo():
-        print "foo"
+        print("foo")
         return printed
 
 def function_with_print_after():
     def foo():
         _print = _print_()
-        print >> _print, "foo"
+        print("foo", file=_print)
         return _print()
 
 def function_with_getattr_before():
--- src/RestrictedPython/tests/class.py.orig	2010-07-07 14:42:56 UTC
+++ src/RestrictedPython/tests/class.py
@@ -10,4 +10,4 @@ x = MyClass()
 x.set(12)
 x.set(x.get() + 1)
 if x.get() != 13:
-    raise AssertionError, "expected 13, got %d" % x.get()
+    raise AssertionError("expected 13, got %d" % x.get())
--- src/RestrictedPython/tests/restricted_module.py.orig	2010-07-07 14:42:56 UTC
+++ src/RestrictedPython/tests/restricted_module.py
@@ -1,42 +1,43 @@
 import sys
+from functools import reduce
 
 def print0():
-    print 'Hello, world!',
+    print('Hello, world!', end=' ')
     return printed
 
 def print1():
-    print 'Hello,',
-    print 'world!',
+    print('Hello,', end=' ')
+    print('world!', end=' ')
     return printed
 
 def printStuff():
-    print 'a', 'b', 'c',
+    print('a', 'b', 'c', end=' ')
     return printed
 
 def printToNone():
     x = None
-    print >>x, 'Hello, world!',
+    print('Hello, world!', end=' ', file=x)
     return printed
 
 def printLines():
     # This failed before Zope 2.4.0a2
-    r = range(3)
+    r = list(range(3))
     for n in r:
         for m in r:
-            print m + n * len(r),
-        print
+            print(m + n * len(r), end=' ')
+        print()
     return printed
 
 def try_map():
     inc = lambda i: i+1
     x = [1, 2, 3]
-    print map(inc, x),
+    print(list(map(inc, x)), end=' ')
     return printed
 
 def try_apply():
     def f(x, y, z):
         return x + y + z
-    print f(*(300, 20), **{'z': 1}),
+    print(f(*(300, 20), **{'z': 1}), end=' ')
     return printed
 
 def try_inplace():
@@ -45,17 +46,17 @@ def try_inplace():
 
 def primes():
     # Somewhat obfuscated code on purpose
-    print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,
-    map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,20))),
+    print([_f for _f in [y*reduce(lambda x,y:x*y!=0,
+    list(map(lambda x,y=y:y%x,list(range(2,int(pow(y,0.5)+1))))),1) for y in range(2,20)] if _f], end=' ')
     return printed
 
 def allowed_read(ob):
-    print ob.allowed
-    print ob.s
-    print ob[0]
-    print ob[2]
-    print ob[3:-1]
-    print len(ob)
+    print(ob.allowed)
+    print(ob.s)
+    print(ob[0])
+    print(ob[2])
+    print(ob[3:-1])
+    print(len(ob))
     return printed
 
 def allowed_default_args(ob):
@@ -83,13 +84,13 @@ def allowed_simple():
 def allowed_write(ob):
     ob.writeable = 1
     #ob.writeable += 1
-    [1 for ob.writeable in 1,2]
+    [1 for ob.writeable in [1,2]]
     ob['safe'] = 2
     #ob['safe'] += 2
-    [1 for ob['safe'] in 1,2]
+    [1 for ob['safe'] in [1,2]]
 
 def denied_print(ob):
-    print >> ob, 'Hello, world!',
+    print('Hello, world!', end=' ', file=ob)
 
 def denied_getattr(ob):
     #ob.disallowed += 1
@@ -108,7 +109,7 @@ def denied_setattr2(ob):
     ob.allowed = -1
 
 def denied_setattr3(ob):
-    [1 for ob.allowed in 1,2]
+    [1 for ob.allowed in [1,2]]
 
 def denied_getitem(ob):
     ob[1]
@@ -125,7 +126,7 @@ def denied_setitem2(ob):
     ob['x'] = 2
 
 def denied_setitem3(ob):
-    [1 for ob['x'] in 1,2]
+    [1 for ob['x'] in [1,2]]
 
 def denied_setslice(ob):
     ob[0:1] = 'a'
@@ -135,7 +136,7 @@ def denied_setslice2(ob):
     ob[0:1] = 'a'
 
 def denied_setslice3(ob):
-    [1 for ob[0:1] in 1,2]
+    [1 for ob[0:1] in [1,2]]
 
 ##def strange_attribute():
 ##    # If a guard has attributes with names that don't start with an
--- src/RestrictedPython/tests/security_in_syntax.py.orig	2010-07-09 04:07:16 UTC
+++ src/RestrictedPython/tests/security_in_syntax.py
@@ -29,7 +29,7 @@ def bad_attr():
     some_ob._some_attr = 15
 
 def no_exec():
-    exec 'q = 1'
+    exec('q = 1')
 
 def no_yield():
     yield 42
@@ -47,7 +47,7 @@ def from_import_as_bad_name():
 def except_using_bad_name():
     try:
         foo
-    except NameError, _leading_underscore:
+    except NameError as _leading_underscore:
         # The name of choice (say, _write) is now assigned to an exception
         # object.  Hard to exploit, but conceivable.
         pass
--- src/RestrictedPython/tests/testRestrictions.py.orig	2010-07-09 04:07:16 UTC
+++ src/RestrictedPython/tests/testRestrictions.py
@@ -52,10 +52,10 @@ def find_source(fn, func):
 
 def get_source(func):
     """Less silly interface to find_source"""
-    file = func.func_globals['__file__']
+    file = func.__globals__['__file__']
     if file.endswith('.pyc'):
         file = file[:-1]
-    source = find_source(file, func.func_code)[1]
+    source = find_source(file, func.__code__)[1]
     assert source.strip(), "Source should not be empty!"
     return source
 
@@ -76,7 +76,7 @@ def create_rmodule():
                  'len', 'chr', 'ord',
                  ):
         rmodule[name] = builtins[name]
-    exec code in rmodule
+    exec(code, rmodule)
 
 class AccessDenied (Exception): pass
 
@@ -145,7 +145,7 @@ def guarded_getitem(ob, index):
 
 def minimal_import(name, _globals, _locals, names):
     if name != "__future__":
-        raise ValueError, "Only future imports are allowed"
+        raise ValueError("Only future imports are allowed")
     import __future__
     return __future__
 
@@ -185,14 +185,14 @@ def inplacevar_wrapper(op, x, y):
     inplacevar_wrapper_called[op] = x, y
     # This is really lame.  But it's just a test. :)
     globs = {'x': x, 'y': y}
-    exec 'x'+op+'y' in globs
+    exec('x'+op+'y', globs)
     return globs['x']
 
 class RestrictionTests(unittest.TestCase):
     def execFunc(self, name, *args, **kw):
         func = rmodule[name]
-        verify.verify(func.func_code)
-        func.func_globals.update({'_getattr_': guarded_getattr,
+        verify.verify(func.__code__)
+        func.__globals__.update({'_getattr_': guarded_getattr,
                                   '_getitem_': guarded_getitem,
                                   '_write_': TestGuard,
                                   '_print_': PrintCollector,
@@ -263,7 +263,7 @@ class RestrictionTests(unittest.TestCase):
         self.assertEqual(inplacevar_wrapper_called['+='], (1, 3))
 
     def checkDenied(self):
-        for k in rmodule.keys():
+        for k in list(rmodule.keys()):
             if k[:6] == 'denied':
                 try:
                     self.execFunc(k, RestrictedObject())
@@ -290,10 +290,10 @@ class RestrictionTests(unittest.TestCase):
         # Unrestricted compile.
         code = compile(source, fn, 'exec')
         m = {'__builtins__': {'__import__':minimal_import}}
-        exec code in m
-        for k, v in m.items():
+        exec(code, m)
+        for k, v in list(m.items()):
             if hasattr(v, 'func_code'):
-                filename, source = find_source(fn, v.func_code)
+                filename, source = find_source(fn, v.__code__)
                 # Now compile it with restrictions
                 try:
                     code = compile_restricted(source, filename, 'exec')
@@ -327,11 +327,11 @@ class RestrictionTests(unittest.TestCase):
         self.assertEqual(res, expect)
 
     def checkStackSize(self):
-        for k, rfunc in rmodule.items():
+        for k, rfunc in list(rmodule.items()):
             if not k.startswith('_') and hasattr(rfunc, 'func_code'):
-                rss = rfunc.func_code.co_stacksize
-                ss = getattr(restricted_module, k).func_code.co_stacksize
-                self.failUnless(
+                rss = rfunc.__code__.co_stacksize
+                ss = getattr(restricted_module, k).__code__.co_stacksize
+                self.assertTrue(
                     rss >= ss, 'The stack size estimate for %s() '
                     'should have been at least %d, but was only %d'
                     % (k, ss, rss))
@@ -427,7 +427,7 @@ class RestrictionTests(unittest.TestCase):
             calls.append(seq)
             return list(seq)
         globals = {"_getiter_": getiter, '_inplacevar_': inplacevar_wrapper}
-        exec co in globals, {}
+        exec(co, globals, {})
         # The comparison here depends on the exact code that is
         # contained in unpack.py.
         # The test doing implicit unpacking in an "except:" clause is
@@ -454,7 +454,7 @@ class RestrictionTests(unittest.TestCase):
                                               [[[3, 4]]], [[3, 4]], [3, 4],
                     ]
         i = expected.index(ineffable)
-        self.assert_(isinstance(calls[i], TypeError))
+        self.assertTrue(isinstance(calls[i], TypeError))
         expected[i] = calls[i]
         self.assertEqual(calls, expected)
 
@@ -466,7 +466,7 @@ class RestrictionTests(unittest.TestCase):
             calls.append(s)
             return list(s)
         globals = {"_getiter_": getiter}
-        exec co in globals, {}
+        exec(co, globals, {})
         self.assertEqual(calls, [[(1,2)], (1, 2)])
 
     def checkUnpackSequenceSingle(self):
@@ -477,7 +477,7 @@ class RestrictionTests(unittest.TestCase):
             calls.append(s)
             return list(s)
         globals = {"_getiter_": getiter}
-        exec co in globals, {}
+        exec(co, globals, {})
         self.assertEqual(calls, [(1, 2)])
 
     def checkClass(self):
@@ -496,7 +496,7 @@ class RestrictionTests(unittest.TestCase):
         globals = {"_getattr_": test_getattr,
                    "_write_": test_setattr,
                    }
-        exec co in globals, {}
+        exec(co, globals, {})
         # Note that the getattr calls don't correspond to the method call
         # order, because the x.set method is fetched before its arguments
         # are evaluated.
@@ -506,7 +506,7 @@ class RestrictionTests(unittest.TestCase):
 
     def checkLambda(self):
         co = self._compile_file("lambda.py")
-        exec co in {}, {}
+        exec(co, {}, {})
 
     def checkEmpty(self):
         rf = RFunction("", "", "issue945", "empty.py", {})
--- src/RestrictedPython/tests/unpack.py.orig	2010-07-07 14:42:56 UTC
+++ src/RestrictedPython/tests/unpack.py
@@ -20,7 +20,7 @@ try:
 except ValueError:
     pass
 else:
-    raise AssertionError, "expected 'unpack list of wrong size'"
+    raise AssertionError("expected 'unpack list of wrong size'")
 
 def u2(L):
     x, (a, b), y = L
@@ -37,9 +37,10 @@ try:
 except TypeError:
     pass
 else:
-    raise AssertionError, "expected 'iteration over non-sequence'"
+    raise AssertionError("expected 'iteration over non-sequence'")
 
-def u3((x, y)):
+def u3(xxx_todo_changeme):
+    (x, y) = xxx_todo_changeme
     assert x == 'a'
     assert y == 'b'
     return x, y
@@ -58,7 +59,8 @@ def u5(x):
         raise TypeError(x)
     # This one is tricky to test, because the first level of unpacking
     # has a TypeError instance.  That's a headache for the test driver.
-    except TypeError, [(a, b)]:
+    except TypeError as xxx_todo_changeme1:
+        [(a, b)] = xxx_todo_changeme1.args
         assert a == 42
         assert b == 666
 
--- src/RestrictedPython/tests/verify.py.orig	2010-07-07 14:42:56 UTC
+++ src/RestrictedPython/tests/verify.py
@@ -83,7 +83,7 @@ def _verifycode(code):
                     window[2].arg == "_write_"):
                 # check that arg is appropriately wrapped
                 for i, op in enumerate(window):
-                    print i, op.opname, op.arg
+                    print(i, op.opname, op.arg)
                 raise ValueError("unguard attribute set/del at %s:%d"
                                  % (code.co_filename, line))
         if op.opname.startswith("UNPACK"):
