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