1c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlimport unittest
2bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xiclunafrom test.test_support import check_syntax_error, check_py3k_warnings, \
3bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna                              check_warnings, run_unittest
44588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
5cd738364ce1a5de26a891b61d2c1baf1e692f0e0Jeremy Hylton
6c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlclass ScopeTests(unittest.TestCase):
74588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
8c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testSimpleNesting(self):
9abd8a336a3ab390a2ea4b15a0ecd187e482001afTim Peters
10c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def make_adder(x):
11c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def adder(y):
12c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return x + y
13c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return adder
144588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
15c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = make_adder(1)
16c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = make_adder(10)
174588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
18c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 2)
19c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(-2), 8)
204588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
21c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testExtraNesting(self):
224588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
23c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def make_adder2(x):
24c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def extra(): # check freevars passing through non-use scopes
25c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def adder(y):
26c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return x + y
27c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return adder
28c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return extra()
294588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
30c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = make_adder2(1)
31c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = make_adder2(10)
324588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
33c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 2)
34c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(-2), 8)
354588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
36c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testSimpleAndRebinding(self):
374588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
38c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def make_adder3(x):
39c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def adder(y):
40c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return x + y
41c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            x = x + 1 # check tracking of assignment to x in defining scope
42c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return adder
434588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
44c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = make_adder3(0)
45c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = make_adder3(9)
464588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
47c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 2)
48c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(-2), 8)
494588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
50c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testNestingGlobalNoFree(self):
514588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
52c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def make_adder4(): # XXX add exta level of indirection
53c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def nest():
54c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def nest():
55c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    def adder(y):
56c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                        return global_x + y # check that plain old globals work
57c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return adder
58c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return nest()
59c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return nest()
604588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
61c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        global_x = 1
62c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        adder = make_adder4()
63c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(adder(1), 2)
644588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
65c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        global_x = 10
66c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(adder(-2), 8)
674588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
68c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testNestingThroughClass(self):
694588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
70c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def make_adder5(x):
71c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            class Adder:
72c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def __call__(self, y):
73c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return x + y
74c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return Adder()
754588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
76c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = make_adder5(1)
77c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = make_adder5(10)
784588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
79c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 2)
80c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(-2), 8)
814588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
82c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testNestingPlusFreeRefToGlobal(self):
834588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
84c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def make_adder6(x):
85c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            global global_nest_x
86c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def adder(y):
87c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return global_nest_x + y
88c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            global_nest_x = x
89c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return adder
904588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
91c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = make_adder6(1)
92c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = make_adder6(10)
934588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
94c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 11) # there's only one global
95c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(-2), 8)
964588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
97c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testNearestEnclosingScope(self):
984588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
99c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x):
100c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def g(y):
101c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                x = 42 # check that this masks binding in f()
102c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def h(z):
103c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return x + z
104c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return h
105c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return g(2)
1064588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
107c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        test_func = f(10)
108c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(test_func(5), 47)
1094588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
110c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testMixedFreevarsAndCellvars(self):
1114588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
112c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def identity(x):
113c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return x
1144588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
115c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x, y, z):
116c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def g(a, b, c):
117c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                a = a + x # 3
118c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def h():
119c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    # z * (4 + 9)
120c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    # 3 * 13
121c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return identity(z * (b + y))
122c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                y = c + z # 9
123c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return h
124c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return g
125c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
126c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        g = f(1, 2, 3)
127c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        h = g(2, 4, 6)
128c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(h(), 39)
129c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
130c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testFreeVarInMethod(self):
131c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
132c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def test():
133c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            method_and_var = "var"
134c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            class Test:
135c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def method_and_var(self):
136c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return "method"
137c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def test(self):
138c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return method_and_var
139c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def actual_global(self):
140c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return str("global")
141c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def str(self):
142c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return str(self)
143c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return Test()
144c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
145c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        t = test()
146c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(t.test(), "var")
147c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(t.method_and_var(), "method")
148c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(t.actual_global(), "global")
149c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
150c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        method_and_var = "var"
151c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        class Test:
152c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            # this class is not nested, so the rules are different
153c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def method_and_var(self):
154c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return "method"
155c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def test(self):
156c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return method_and_var
157c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def actual_global(self):
158c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return str("global")
159c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def str(self):
160c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return str(self)
161c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
162c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        t = Test()
163c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(t.test(), "var")
164c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(t.method_and_var(), "method")
165c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(t.actual_global(), "global")
166c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
167c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testRecursion(self):
168c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
169c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x):
170c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def fact(n):
171c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                if n == 0:
172c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return 1
173c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                else:
174c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return n * fact(n - 1)
175c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            if x >= 0:
176c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return fact(x)
177c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            else:
178c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                raise ValueError, "x must be >= 0"
179c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
180c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(f(6), 720)
181c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
182c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
183c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testUnoptimizedNamespaces(self):
184c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
185c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        check_syntax_error(self, """\
1865941d191deaf2a0c8eab5ce75316067ed16dfb1aJeremy Hyltondef unoptimized_clash1(strip):
1874588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    def f(s):
1884588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton        from string import *
1894588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton        return strip(s) # ambiguity: free or local
1904588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    return f
19197a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton""")
1924588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
193c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        check_syntax_error(self, """\
1945941d191deaf2a0c8eab5ce75316067ed16dfb1aJeremy Hyltondef unoptimized_clash2():
1954588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    from string import *
1964588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    def f(s):
1974588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton        return strip(s) # ambiguity: global or local
1984588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    return f
19997a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton""")
2004588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
201c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        check_syntax_error(self, """\
2025941d191deaf2a0c8eab5ce75316067ed16dfb1aJeremy Hyltondef unoptimized_clash2():
20397a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    from string import *
20497a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    def g():
20597a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton        def f(s):
20697a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton            return strip(s) # ambiguity: global or local
20797a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton        return f
20897a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton""")
20997a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
210c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        # XXX could allow this for exec with const argument, but what's the point
211c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        check_syntax_error(self, """\
2125941d191deaf2a0c8eab5ce75316067ed16dfb1aJeremy Hyltondef error(y):
2134588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    exec "a = 1"
2144588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    def f(x):
2154588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton        return x + y
2164588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    return f
21797a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton""")
2184588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
219c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        check_syntax_error(self, """\
2205941d191deaf2a0c8eab5ce75316067ed16dfb1aJeremy Hyltondef f(x):
2214588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton    def g():
2224588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton        return x
22397a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    del x # can't del name
22497a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton""")
22597a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
226c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        check_syntax_error(self, """\
2275941d191deaf2a0c8eab5ce75316067ed16dfb1aJeremy Hyltondef f():
22897a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    def g():
229c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        from string import *
230c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        return strip # global or local?
2310e6d213177dd571dd634d286ae45c38eb06d63b9Tim Peters""")
23297a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
233c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        # and verify a few cases that should work
23497a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
235c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        exec """
23697a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hyltondef noproblem1():
23797a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    from string import *
23897a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    f = lambda x:x
23997a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
24097a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hyltondef noproblem2():
24197a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    from string import *
24297a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    def f(x):
24397a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton        return x + 1
24497a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
24597a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hyltondef noproblem3():
24697a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    from string import *
24797a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton    def f(x):
24897a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton        global y
24997a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton        y = x
250cd738364ce1a5de26a891b61d2c1baf1e692f0e0Jeremy Hylton"""
2514588c78fafd569deb21b1a721a8507636a507837Jeremy Hylton
252c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testLambdas(self):
253c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
254c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        f1 = lambda x: lambda y: x + y
255c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = f1(1)
256c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = f1(10)
257c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 2)
258c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(5), 15)
259c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
260c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        f2 = lambda x: (lambda : lambda y: x + y)()
261c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = f2(1)
262c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        plus10 = f2(10)
263c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(1), 2)
264c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(plus10(5), 15)
265c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
266c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        f3 = lambda x: lambda y: global_x + y
267c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        global_x = 1
268c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inc = f3(None)
269c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inc(2), 3)
270c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
271c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        f8 = lambda x, y, z: lambda a, b, c: lambda : z * (b + y)
272c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        g = f8(1, 2, 3)
273c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        h = g(2, 4, 6)
274c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(h(), 18)
275c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
276c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testUnboundLocal(self):
277c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
278c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def errorInOuter():
279c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            print y
280c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def inner():
281c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return y
282c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            y = 1
283c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
284c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def errorInInner():
285c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def inner():
286c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return y
287c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            inner()
288c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            y = 1
289c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
29050a225285179e3ddb6729fef83826f294b660823Benjamin Peterson        self.assertRaises(UnboundLocalError, errorInOuter)
29150a225285179e3ddb6729fef83826f294b660823Benjamin Peterson        self.assertRaises(NameError, errorInInner)
29297a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
293c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        # test for bug #1501934: incorrect LOAD/STORE_GLOBAL generation
294c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        exec """
2950e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauerglobal_x = 1
2960e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauerdef f():
2970e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauer    global_x += 1
2980e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauertry:
2990e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauer    f()
3000e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauerexcept UnboundLocalError:
3010e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauer    pass
3020e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauerelse:
303c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    fail('scope of global_x not correctly determined')
304c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl""" in {'fail': self.fail}
3050e07b60a4e44129cfafaeacac765cf957e2ea219Neil Schemenauer
306c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testComplexDefinitions(self):
30797a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
308c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def makeReturner(*lst):
309c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def returner():
310c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return lst
311c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return returner
3120e6d213177dd571dd634d286ae45c38eb06d63b9Tim Peters
313c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(makeReturner(1,2,3)(), (1,2,3))
3140e6d213177dd571dd634d286ae45c38eb06d63b9Tim Peters
315c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def makeReturner2(**kwargs):
316c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def returner():
317c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return kwargs
318c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return returner
31997a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
320c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(makeReturner2(a=11)()['a'], 11)
32197a01674b25739e0fc9e534dacf5a683d8b399e0Jeremy Hylton
322bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna        with check_py3k_warnings(("tuple parameter unpacking has been removed",
323bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna                                  SyntaxWarning)):
324bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna            exec """\
325bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xiclunadef makeAddPair((a, b)):
326bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna    def addPair((c, d)):
327bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna        return (a + c, b + d)
328bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna    return addPair
329bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna""" in locals()
330c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(makeAddPair((1, 2))((100, 200)), (101,202))
3319aa643cf6909170d31cfff955318ea7317234663Guido van Rossum
332c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testScopeOfGlobalStmt(self):
3339aa643cf6909170d31cfff955318ea7317234663Guido van Rossum# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
3349aa643cf6909170d31cfff955318ea7317234663Guido van Rossum
335c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        exec """\
3369aa643cf6909170d31cfff955318ea7317234663Guido van Rossum# I
3379aa643cf6909170d31cfff955318ea7317234663Guido van Rossumx = 7
3389aa643cf6909170d31cfff955318ea7317234663Guido van Rossumdef f():
3399aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    x = 1
3409aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    def g():
3419aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        global x
3429aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        def i():
3439aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            def h():
3449aa643cf6909170d31cfff955318ea7317234663Guido van Rossum                return x
3459aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            return h()
3469aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        return i()
3479aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    return g()
348c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(f(), 7)
349c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(x, 7)
3509aa643cf6909170d31cfff955318ea7317234663Guido van Rossum
3519aa643cf6909170d31cfff955318ea7317234663Guido van Rossum# II
3529aa643cf6909170d31cfff955318ea7317234663Guido van Rossumx = 7
3539aa643cf6909170d31cfff955318ea7317234663Guido van Rossumdef f():
3549aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    x = 1
3559aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    def g():
3569aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        x = 2
3579aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        def i():
3589aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            def h():
3599aa643cf6909170d31cfff955318ea7317234663Guido van Rossum                return x
3609aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            return h()
3619aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        return i()
3629aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    return g()
363c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(f(), 2)
364c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(x, 7)
3659aa643cf6909170d31cfff955318ea7317234663Guido van Rossum
3669aa643cf6909170d31cfff955318ea7317234663Guido van Rossum# III
3679aa643cf6909170d31cfff955318ea7317234663Guido van Rossumx = 7
3689aa643cf6909170d31cfff955318ea7317234663Guido van Rossumdef f():
3699aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    x = 1
3709aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    def g():
3719aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        global x
3729aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        x = 2
3739aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        def i():
3749aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            def h():
3759aa643cf6909170d31cfff955318ea7317234663Guido van Rossum                return x
3769aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            return h()
3779aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        return i()
3789aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    return g()
379c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(f(), 2)
380c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(x, 2)
3819aa643cf6909170d31cfff955318ea7317234663Guido van Rossum
3829aa643cf6909170d31cfff955318ea7317234663Guido van Rossum# IV
3839aa643cf6909170d31cfff955318ea7317234663Guido van Rossumx = 7
3849aa643cf6909170d31cfff955318ea7317234663Guido van Rossumdef f():
3859aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    x = 3
3869aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    def g():
3879aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        global x
3889aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        x = 2
3899aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        def i():
3909aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            def h():
3919aa643cf6909170d31cfff955318ea7317234663Guido van Rossum                return x
3929aa643cf6909170d31cfff955318ea7317234663Guido van Rossum            return h()
3939aa643cf6909170d31cfff955318ea7317234663Guido van Rossum        return i()
3949aa643cf6909170d31cfff955318ea7317234663Guido van Rossum    return g()
395c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(f(), 2)
396c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(x, 2)
3973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
3983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton# XXX what about global statements in class blocks?
3993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton# do they affect methods?
4003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonx = 12
4023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonclass Global:
4033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    global x
4043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    x = 13
4053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    def set(self, val):
4063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        x = val
4073e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton    def get(self):
4083e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton        return x
4093e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
4103e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltong = Global()
411c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(g.get(), 13)
4123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltong.set(15)
413c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(g.get(), 13)
414c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl"""
4155b44a67bdb67545679a2e1bfcf482996f8d8abb5Jeremy Hylton
416c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testLeaks(self):
4175b44a67bdb67545679a2e1bfcf482996f8d8abb5Jeremy Hylton
418c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        class Foo:
419c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            count = 0
42030edd2387d5d5c1a266956434ebaed59ccfb923fTim Peters
421c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def __init__(self):
422c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                Foo.count += 1
4235b44a67bdb67545679a2e1bfcf482996f8d8abb5Jeremy Hylton
424c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def __del__(self):
425c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                Foo.count -= 1
4265b44a67bdb67545679a2e1bfcf482996f8d8abb5Jeremy Hylton
427c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f1():
428c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            x = Foo()
429c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def f2():
430c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return x
431c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            f2()
43230edd2387d5d5c1a266956434ebaed59ccfb923fTim Peters
433c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        for i in range(100):
434c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            f1()
4355b44a67bdb67545679a2e1bfcf482996f8d8abb5Jeremy Hylton
436c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(Foo.count, 0)
4375c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton
438c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testClassAndGlobal(self):
4395c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton
440c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        exec """\
4415c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hyltondef test(x):
4425c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton    class Foo:
4435c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton        global x
4445c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton        def __call__(self, y):
4455c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton            return x + y
4465c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton    return Foo()
4475c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton
4485c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hyltonx = 0
449c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(test(6)(2), 8)
4505c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hyltonx = -1
451c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlself.assertEqual(test(3)(2), 5)
4525c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton
453d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauerlooked_up_by_load_name = False
454d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauerclass X:
455d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauer    # Implicit globals inside classes are be looked up by LOAD_NAME, not
456d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauer    # LOAD_GLOBAL.
457d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauer    locals()['looked_up_by_load_name'] = True
458d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauer    passed = looked_up_by_load_name
459d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauer
4605c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Petersonself.assertTrue(X.passed)
461c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl"""
462d403c453869f04ab68154dd448f2473e5fed9dcaNeil Schemenauer
463c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testLocalsFunction(self):
4645c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton
465c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x):
466c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def g(y):
467c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def h(z):
468c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return y + z
469c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                w = x + y
470c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                y += 3
471c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return locals()
472c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return g
4735c7a2513ec277c6c4f5ab4f44b461aeb17a850c4Jeremy Hylton
474c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        d = f(2)(4)
475bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna        self.assertIn('h', d)
476c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        del d['h']
477c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(d, {'x': 2, 'y': 7, 'w': 6})
478c76770c68c40021322c221dd6bcd62bf98356a33Jeremy Hylton
479759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton    def testLocalsClass(self):
480759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # This test verifies that calling locals() does not pollute
481759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # the local namespace of the class with free variables.  Old
482759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # versions of Python had a bug, where a free variable being
483759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # passed through a class namespace would be inserted into
484759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # locals() by locals() or exec or a trace function.
485759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        #
486759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # The real bug lies in frame code that copies variables
487759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # between fast locals and the locals dict, e.g. when executing
488759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        # a trace function.
489759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton
490759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        def f(x):
491759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton            class C:
492759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                x = 12
493759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                def m(self):
494759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                    return x
495759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                locals()
496759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton            return C
497759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton
498759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        self.assertEqual(f(1).x, 12)
499759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton
500759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        def f(x):
501759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton            class C:
502759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                y = x
503759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                def m(self):
504759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                    return x
505759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton                z = list(locals())
506759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton            return C
507759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton
508759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton        varnames = f(1).z
509aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn("x", varnames)
510aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn("y", varnames)
511759410b372915be0de2a225d7fc6b71dcfae6db3Jeremy Hylton
512e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc    def testLocalsClass_WithTrace(self):
513e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        # Issue23728: after the trace function returns, the locals()
514e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        # dictionary is used to update all variables, this used to
515e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        # include free variables. But in class statements, free
516e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        # variables are not inserted...
517e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        import sys
518e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        sys.settrace(lambda a,b,c:None)
519e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        try:
520e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc            x = 12
521e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc
522e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc            class C:
523e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc                def f(self):
524e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc                    return x
525e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc
5262623a37852153363335956afab010cb0beb7e74eEzio Melotti            self.assertEqual(x, 12) # Used to raise UnboundLocalError
527e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc        finally:
528e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc            sys.settrace(None)
529e4921fec0140da8c64f9e694904a7d709de745b4Amaury Forgeot d'Arc
530c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testBoundAndFree(self):
531c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        # var is bound and free in class
532ddc4fd03b1eadeab65f8e0dbf5b6f386ed419fbcJeremy Hylton
533c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x):
534c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            class C:
535c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                def m(self):
536c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    return x
537c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                a = x
538c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return C
539ddc4fd03b1eadeab65f8e0dbf5b6f386ed419fbcJeremy Hylton
540c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        inst = f(3)()
541c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertEqual(inst.a, inst.m())
5424c889011db22df761709ac8f9bc246bf4931e9c4Jeremy Hylton
543c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testInteractionWithTraceFunc(self):
5444c889011db22df761709ac8f9bc246bf4931e9c4Jeremy Hylton
545c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        import sys
546c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def tracer(a,b,c):
547c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return tracer
5484c889011db22df761709ac8f9bc246bf4931e9c4Jeremy Hylton
549c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def adaptgetter(name, klass, getter):
550c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            kind, des = getter
551c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            if kind == 1:       # AV happens when stepping from this line to next
552c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                if des == "":
553c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                    des = "_%s__%s" % (klass.__name__, name)
554c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                return lambda obj: getattr(obj, des)
5554c889011db22df761709ac8f9bc246bf4931e9c4Jeremy Hylton
556c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        class TestClass:
557c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            pass
5584c889011db22df761709ac8f9bc246bf4931e9c4Jeremy Hylton
559c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        sys.settrace(tracer)
560c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        adaptgetter("foo", TestClass, (1, ""))
561c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        sys.settrace(None)
5625121e7de11eaf8ef872aef4b0c58612d6a814161Jeremy Hylton
563c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertRaises(TypeError, sys.settrace)
564290d31e2fc02a0d887da2c76fbe4e72377442a0aNeal Norwitz
565c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testEvalExecFreeVars(self):
5665121e7de11eaf8ef872aef4b0c58612d6a814161Jeremy Hylton
567c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x):
568c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return lambda: x + 1
5695121e7de11eaf8ef872aef4b0c58612d6a814161Jeremy Hylton
570c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        g = f(3)
571c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        self.assertRaises(TypeError, eval, g.func_code)
572cd738364ce1a5de26a891b61d2c1baf1e692f0e0Jeremy Hylton
573c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        try:
574c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            exec g.func_code in {}
575c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        except TypeError:
576c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            pass
577c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        else:
578c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            self.fail("exec should have failed, because code contained free vars")
579ccae8377a329fe60193a605697b5ffefb4734960Jeremy Hylton
580c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testListCompLocalVars(self):
581cf672f15e0b31eaff58e54dbbe62a2d52d49a63cJeremy Hylton
582c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        try:
583c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            print bad
584c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        except NameError:
585c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            pass
586c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        else:
587c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            print "bad should not be defined"
588cf672f15e0b31eaff58e54dbbe62a2d52d49a63cJeremy Hylton
589c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def x():
590c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            [bad for s in 'a b' for bad in s.split()]
591cf672f15e0b31eaff58e54dbbe62a2d52d49a63cJeremy Hylton
592c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        x()
593c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        try:
594c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            print bad
595c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        except NameError:
596c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            pass
597954aed8c8d93145347d10fd3ac6c2bc6634ef674Jeremy Hylton
598c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    def testEvalFreeVars(self):
599954aed8c8d93145347d10fd3ac6c2bc6634ef674Jeremy Hylton
600c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        def f(x):
601c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            def g():
602c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                x
603c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl                eval("x + 1")
604c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl            return g
605c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
606c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl        f(4)()
607c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
608632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc    def testFreeingCell(self):
609632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc        # Test what happens when a finalizer accesses
610632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc        # the cell where the object was stored.
611632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc        class Special:
612632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc            def __del__(self):
613632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc                nestedcell_get()
614632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc
615632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc        def f():
616632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc            global nestedcell_get
617632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc            def nestedcell_get():
618632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc                return c
619632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc
620632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc            c = (Special(),)
621632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc            c = 2
622632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc
623632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc        f() # used to crash the interpreter...
624632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc
62588f1c042150466f94784526e14842eb694a54735Jeremy Hylton    def testGlobalInParallelNestedFunctions(self):
62688f1c042150466f94784526e14842eb694a54735Jeremy Hylton        # A symbol table bug leaked the global statement from one
62788f1c042150466f94784526e14842eb694a54735Jeremy Hylton        # function to other nested functions in the same block.
62888f1c042150466f94784526e14842eb694a54735Jeremy Hylton        # This test verifies that a global statement in the first
62988f1c042150466f94784526e14842eb694a54735Jeremy Hylton        # function does not affect the second function.
63088f1c042150466f94784526e14842eb694a54735Jeremy Hylton        CODE = """def f():
63188f1c042150466f94784526e14842eb694a54735Jeremy Hylton    y = 1
63288f1c042150466f94784526e14842eb694a54735Jeremy Hylton    def g():
63388f1c042150466f94784526e14842eb694a54735Jeremy Hylton        global y
63488f1c042150466f94784526e14842eb694a54735Jeremy Hylton        return y
63588f1c042150466f94784526e14842eb694a54735Jeremy Hylton    def h():
63688f1c042150466f94784526e14842eb694a54735Jeremy Hylton        return y + 1
63788f1c042150466f94784526e14842eb694a54735Jeremy Hylton    return g, h
63888f1c042150466f94784526e14842eb694a54735Jeremy Hylton
63988f1c042150466f94784526e14842eb694a54735Jeremy Hyltony = 9
64088f1c042150466f94784526e14842eb694a54735Jeremy Hyltong, h = f()
64188f1c042150466f94784526e14842eb694a54735Jeremy Hyltonresult9 = g()
64288f1c042150466f94784526e14842eb694a54735Jeremy Hyltonresult2 = h()
64388f1c042150466f94784526e14842eb694a54735Jeremy Hylton"""
64488f1c042150466f94784526e14842eb694a54735Jeremy Hylton        local_ns = {}
64588f1c042150466f94784526e14842eb694a54735Jeremy Hylton        global_ns = {}
64688f1c042150466f94784526e14842eb694a54735Jeremy Hylton        exec CODE in local_ns, global_ns
64788f1c042150466f94784526e14842eb694a54735Jeremy Hylton        self.assertEqual(2, global_ns["result2"])
64888f1c042150466f94784526e14842eb694a54735Jeremy Hylton        self.assertEqual(9, global_ns["result9"])
649632fad393304db484f508d1833a9fda52b7f193aAmaury Forgeot d'Arc
650f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson    def testTopIsNotSignificant(self):
651f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson        # See #9997.
652f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson        def top(a):
653f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson            pass
654f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson        def b():
655f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson            global a
656f76942d6bf432d6881dc47070002d226e1e15ce9Benjamin Peterson
657c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl
658c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandldef test_main():
659bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna    with check_warnings(("import \* only allowed at module level",
660bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna                         SyntaxWarning)):
661bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna        run_unittest(ScopeTests)
662954aed8c8d93145347d10fd3ac6c2bc6634ef674Jeremy Hylton
663c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandlif __name__ == '__main__':
664c6fdec6d7eef0582baefd77b4a51da9b69326a37Georg Brandl    test_main()
665