blob: 169a727891a286a25631a500c2449f871dbfa8c5 [file] [log] [blame]
Georg Brandlc6fdec62006-10-28 13:10:17 +00001import unittest
Ezio Melottiee1e2c92010-08-03 06:37:50 +00002from test.test_support import (check_syntax_error, _check_py3k_warnings,
3 check_warnings, run_unittest)
Jeremy Hylton4588c782001-01-25 20:11:23 +00004
Jeremy Hyltoncd738362001-08-07 16:38:19 +00005
Georg Brandlc6fdec62006-10-28 13:10:17 +00006class ScopeTests(unittest.TestCase):
Jeremy Hylton4588c782001-01-25 20:11:23 +00007
Georg Brandlc6fdec62006-10-28 13:10:17 +00008 def testSimpleNesting(self):
Tim Petersabd8a332006-11-03 02:32:46 +00009
Georg Brandlc6fdec62006-10-28 13:10:17 +000010 def make_adder(x):
Jeremy Hylton4588c782001-01-25 20:11:23 +000011 def adder(y):
Georg Brandlc6fdec62006-10-28 13:10:17 +000012 return x + y
Jeremy Hylton4588c782001-01-25 20:11:23 +000013 return adder
Jeremy Hylton4588c782001-01-25 20:11:23 +000014
Georg Brandlc6fdec62006-10-28 13:10:17 +000015 inc = make_adder(1)
16 plus10 = make_adder(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000017
Georg Brandlc6fdec62006-10-28 13:10:17 +000018 self.assertEqual(inc(1), 2)
19 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000020
Georg Brandlc6fdec62006-10-28 13:10:17 +000021 def testExtraNesting(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000022
Georg Brandlc6fdec62006-10-28 13:10:17 +000023 def make_adder2(x):
24 def extra(): # check freevars passing through non-use scopes
25 def adder(y):
26 return x + y
27 return adder
28 return extra()
Jeremy Hylton4588c782001-01-25 20:11:23 +000029
Georg Brandlc6fdec62006-10-28 13:10:17 +000030 inc = make_adder2(1)
31 plus10 = make_adder2(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000032
Georg Brandlc6fdec62006-10-28 13:10:17 +000033 self.assertEqual(inc(1), 2)
34 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000035
Georg Brandlc6fdec62006-10-28 13:10:17 +000036 def testSimpleAndRebinding(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000037
Georg Brandlc6fdec62006-10-28 13:10:17 +000038 def make_adder3(x):
39 def adder(y):
40 return x + y
41 x = x + 1 # check tracking of assignment to x in defining scope
42 return adder
Jeremy Hylton4588c782001-01-25 20:11:23 +000043
Georg Brandlc6fdec62006-10-28 13:10:17 +000044 inc = make_adder3(0)
45 plus10 = make_adder3(9)
Jeremy Hylton4588c782001-01-25 20:11:23 +000046
Georg Brandlc6fdec62006-10-28 13:10:17 +000047 self.assertEqual(inc(1), 2)
48 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000049
Georg Brandlc6fdec62006-10-28 13:10:17 +000050 def testNestingGlobalNoFree(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000051
Georg Brandlc6fdec62006-10-28 13:10:17 +000052 def make_adder4(): # XXX add exta level of indirection
53 def nest():
54 def nest():
55 def adder(y):
56 return global_x + y # check that plain old globals work
57 return adder
58 return nest()
59 return nest()
Jeremy Hylton4588c782001-01-25 20:11:23 +000060
Georg Brandlc6fdec62006-10-28 13:10:17 +000061 global_x = 1
62 adder = make_adder4()
63 self.assertEqual(adder(1), 2)
Jeremy Hylton4588c782001-01-25 20:11:23 +000064
Georg Brandlc6fdec62006-10-28 13:10:17 +000065 global_x = 10
66 self.assertEqual(adder(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000067
Georg Brandlc6fdec62006-10-28 13:10:17 +000068 def testNestingThroughClass(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000069
Georg Brandlc6fdec62006-10-28 13:10:17 +000070 def make_adder5(x):
71 class Adder:
72 def __call__(self, y):
73 return x + y
74 return Adder()
Jeremy Hylton4588c782001-01-25 20:11:23 +000075
Georg Brandlc6fdec62006-10-28 13:10:17 +000076 inc = make_adder5(1)
77 plus10 = make_adder5(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000078
Georg Brandlc6fdec62006-10-28 13:10:17 +000079 self.assertEqual(inc(1), 2)
80 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000081
Georg Brandlc6fdec62006-10-28 13:10:17 +000082 def testNestingPlusFreeRefToGlobal(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000083
Georg Brandlc6fdec62006-10-28 13:10:17 +000084 def make_adder6(x):
85 global global_nest_x
86 def adder(y):
87 return global_nest_x + y
88 global_nest_x = x
89 return adder
Jeremy Hylton4588c782001-01-25 20:11:23 +000090
Georg Brandlc6fdec62006-10-28 13:10:17 +000091 inc = make_adder6(1)
92 plus10 = make_adder6(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000093
Georg Brandlc6fdec62006-10-28 13:10:17 +000094 self.assertEqual(inc(1), 11) # there's only one global
95 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000096
Georg Brandlc6fdec62006-10-28 13:10:17 +000097 def testNearestEnclosingScope(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000098
Georg Brandlc6fdec62006-10-28 13:10:17 +000099 def f(x):
100 def g(y):
101 x = 42 # check that this masks binding in f()
102 def h(z):
103 return x + z
104 return h
105 return g(2)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000106
Georg Brandlc6fdec62006-10-28 13:10:17 +0000107 test_func = f(10)
108 self.assertEqual(test_func(5), 47)
109
110 def testMixedFreevarsAndCellvars(self):
111
112 def identity(x):
113 return x
114
115 def f(x, y, z):
116 def g(a, b, c):
117 a = a + x # 3
118 def h():
119 # z * (4 + 9)
120 # 3 * 13
121 return identity(z * (b + y))
122 y = c + z # 9
123 return h
124 return g
125
126 g = f(1, 2, 3)
127 h = g(2, 4, 6)
128 self.assertEqual(h(), 39)
129
130 def testFreeVarInMethod(self):
131
132 def test():
133 method_and_var = "var"
134 class Test:
135 def method_and_var(self):
136 return "method"
137 def test(self):
138 return method_and_var
139 def actual_global(self):
140 return str("global")
141 def str(self):
142 return str(self)
143 return Test()
144
145 t = test()
146 self.assertEqual(t.test(), "var")
147 self.assertEqual(t.method_and_var(), "method")
148 self.assertEqual(t.actual_global(), "global")
149
150 method_and_var = "var"
151 class Test:
152 # this class is not nested, so the rules are different
153 def method_and_var(self):
154 return "method"
155 def test(self):
156 return method_and_var
157 def actual_global(self):
158 return str("global")
159 def str(self):
160 return str(self)
161
162 t = Test()
163 self.assertEqual(t.test(), "var")
164 self.assertEqual(t.method_and_var(), "method")
165 self.assertEqual(t.actual_global(), "global")
166
167 def testRecursion(self):
168
169 def f(x):
170 def fact(n):
171 if n == 0:
172 return 1
173 else:
174 return n * fact(n - 1)
175 if x >= 0:
176 return fact(x)
177 else:
178 raise ValueError, "x must be >= 0"
179
180 self.assertEqual(f(6), 720)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000181
182
Georg Brandlc6fdec62006-10-28 13:10:17 +0000183 def testUnoptimizedNamespaces(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000184
Georg Brandlc6fdec62006-10-28 13:10:17 +0000185 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000186def unoptimized_clash1(strip):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000187 def f(s):
188 from string import *
189 return strip(s) # ambiguity: free or local
190 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000191""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000192
Georg Brandlc6fdec62006-10-28 13:10:17 +0000193 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000194def unoptimized_clash2():
Jeremy Hylton4588c782001-01-25 20:11:23 +0000195 from string import *
196 def f(s):
197 return strip(s) # ambiguity: global or local
198 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000199""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000200
Georg Brandlc6fdec62006-10-28 13:10:17 +0000201 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000202def unoptimized_clash2():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000203 from string import *
204 def g():
205 def f(s):
206 return strip(s) # ambiguity: global or local
207 return f
208""")
209
Georg Brandlc6fdec62006-10-28 13:10:17 +0000210 # XXX could allow this for exec with const argument, but what's the point
211 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000212def error(y):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000213 exec "a = 1"
214 def f(x):
215 return x + y
216 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000217""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000218
Georg Brandlc6fdec62006-10-28 13:10:17 +0000219 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000220def f(x):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000221 def g():
222 return x
Jeremy Hylton97a01672001-02-09 22:56:46 +0000223 del x # can't del name
224""")
225
Georg Brandlc6fdec62006-10-28 13:10:17 +0000226 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000227def f():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000228 def g():
Georg Brandlc6fdec62006-10-28 13:10:17 +0000229 from string import *
230 return strip # global or local?
Tim Peters0e6d2132001-02-15 23:56:39 +0000231""")
Jeremy Hylton97a01672001-02-09 22:56:46 +0000232
Georg Brandlc6fdec62006-10-28 13:10:17 +0000233 # and verify a few cases that should work
Jeremy Hylton97a01672001-02-09 22:56:46 +0000234
Georg Brandlc6fdec62006-10-28 13:10:17 +0000235 exec """
Jeremy Hylton97a01672001-02-09 22:56:46 +0000236def noproblem1():
237 from string import *
238 f = lambda x:x
239
240def noproblem2():
241 from string import *
242 def f(x):
243 return x + 1
244
245def noproblem3():
246 from string import *
247 def f(x):
248 global y
249 y = x
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000250"""
Jeremy Hylton4588c782001-01-25 20:11:23 +0000251
Georg Brandlc6fdec62006-10-28 13:10:17 +0000252 def testLambdas(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000253
Georg Brandlc6fdec62006-10-28 13:10:17 +0000254 f1 = lambda x: lambda y: x + y
255 inc = f1(1)
256 plus10 = f1(10)
257 self.assertEqual(inc(1), 2)
258 self.assertEqual(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000259
Georg Brandlc6fdec62006-10-28 13:10:17 +0000260 f2 = lambda x: (lambda : lambda y: x + y)()
261 inc = f2(1)
262 plus10 = f2(10)
263 self.assertEqual(inc(1), 2)
264 self.assertEqual(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000265
Georg Brandlc6fdec62006-10-28 13:10:17 +0000266 f3 = lambda x: lambda y: global_x + y
267 global_x = 1
268 inc = f3(None)
269 self.assertEqual(inc(2), 3)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000270
Georg Brandlc6fdec62006-10-28 13:10:17 +0000271 f8 = lambda x, y, z: lambda a, b, c: lambda : z * (b + y)
272 g = f8(1, 2, 3)
273 h = g(2, 4, 6)
274 self.assertEqual(h(), 18)
Jeremy Hyltonde602482001-02-05 17:35:20 +0000275
Georg Brandlc6fdec62006-10-28 13:10:17 +0000276 def testUnboundLocal(self):
Jeremy Hyltonde602482001-02-05 17:35:20 +0000277
Georg Brandlc6fdec62006-10-28 13:10:17 +0000278 def errorInOuter():
279 print y
280 def inner():
281 return y
282 y = 1
Jeremy Hyltonde602482001-02-05 17:35:20 +0000283
Georg Brandlc6fdec62006-10-28 13:10:17 +0000284 def errorInInner():
285 def inner():
286 return y
287 inner()
288 y = 1
Jeremy Hyltonde602482001-02-05 17:35:20 +0000289
Georg Brandlc6fdec62006-10-28 13:10:17 +0000290 try:
291 errorInOuter()
292 except UnboundLocalError:
293 pass
294 else:
295 self.fail()
Jeremy Hyltonde602482001-02-05 17:35:20 +0000296
Georg Brandlc6fdec62006-10-28 13:10:17 +0000297 try:
298 errorInInner()
299 except NameError:
300 pass
301 else:
302 self.fail()
Jeremy Hylton97a01672001-02-09 22:56:46 +0000303
Georg Brandlc6fdec62006-10-28 13:10:17 +0000304 # test for bug #1501934: incorrect LOAD/STORE_GLOBAL generation
305 exec """
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000306global_x = 1
307def f():
308 global_x += 1
309try:
310 f()
311except UnboundLocalError:
312 pass
313else:
Georg Brandlc6fdec62006-10-28 13:10:17 +0000314 fail('scope of global_x not correctly determined')
315""" in {'fail': self.fail}
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000316
Georg Brandlc6fdec62006-10-28 13:10:17 +0000317 def testComplexDefinitions(self):
Jeremy Hylton97a01672001-02-09 22:56:46 +0000318
Georg Brandlc6fdec62006-10-28 13:10:17 +0000319 def makeReturner(*lst):
320 def returner():
321 return lst
322 return returner
Tim Peters0e6d2132001-02-15 23:56:39 +0000323
Georg Brandlc6fdec62006-10-28 13:10:17 +0000324 self.assertEqual(makeReturner(1,2,3)(), (1,2,3))
Tim Peters0e6d2132001-02-15 23:56:39 +0000325
Georg Brandlc6fdec62006-10-28 13:10:17 +0000326 def makeReturner2(**kwargs):
327 def returner():
328 return kwargs
329 return returner
Jeremy Hylton97a01672001-02-09 22:56:46 +0000330
Georg Brandlc6fdec62006-10-28 13:10:17 +0000331 self.assertEqual(makeReturner2(a=11)()['a'], 11)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000332
Ezio Melottiee1e2c92010-08-03 06:37:50 +0000333 with _check_py3k_warnings(("tuple parameter unpacking has been removed",
334 SyntaxWarning)):
335 exec """\
336def makeAddPair((a, b)):
337 def addPair((c, d)):
338 return (a + c, b + d)
339 return addPair
340""" in locals()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000341 self.assertEqual(makeAddPair((1, 2))((100, 200)), (101,202))
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000342
Georg Brandlc6fdec62006-10-28 13:10:17 +0000343 def testScopeOfGlobalStmt(self):
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000344# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
345
Georg Brandlc6fdec62006-10-28 13:10:17 +0000346 exec """\
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000347# I
348x = 7
349def f():
350 x = 1
351 def g():
352 global x
353 def i():
354 def h():
355 return x
356 return h()
357 return i()
358 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000359self.assertEqual(f(), 7)
360self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000361
362# II
363x = 7
364def f():
365 x = 1
366 def g():
367 x = 2
368 def i():
369 def h():
370 return x
371 return h()
372 return i()
373 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000374self.assertEqual(f(), 2)
375self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000376
377# III
378x = 7
379def f():
380 x = 1
381 def g():
382 global x
383 x = 2
384 def i():
385 def h():
386 return x
387 return h()
388 return i()
389 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000390self.assertEqual(f(), 2)
391self.assertEqual(x, 2)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000392
393# IV
394x = 7
395def f():
396 x = 3
397 def g():
398 global x
399 x = 2
400 def i():
401 def h():
402 return x
403 return h()
404 return i()
405 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000406self.assertEqual(f(), 2)
407self.assertEqual(x, 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000408
409# XXX what about global statements in class blocks?
410# do they affect methods?
411
412x = 12
413class Global:
414 global x
415 x = 13
416 def set(self, val):
417 x = val
418 def get(self):
419 return x
420
421g = Global()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000422self.assertEqual(g.get(), 13)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423g.set(15)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000424self.assertEqual(g.get(), 13)
425"""
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000426
Georg Brandlc6fdec62006-10-28 13:10:17 +0000427 def testLeaks(self):
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000428
Georg Brandlc6fdec62006-10-28 13:10:17 +0000429 class Foo:
430 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000431
Georg Brandlc6fdec62006-10-28 13:10:17 +0000432 def __init__(self):
433 Foo.count += 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000434
Georg Brandlc6fdec62006-10-28 13:10:17 +0000435 def __del__(self):
436 Foo.count -= 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000437
Georg Brandlc6fdec62006-10-28 13:10:17 +0000438 def f1():
439 x = Foo()
440 def f2():
441 return x
442 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000443
Georg Brandlc6fdec62006-10-28 13:10:17 +0000444 for i in range(100):
445 f1()
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000446
Georg Brandlc6fdec62006-10-28 13:10:17 +0000447 self.assertEqual(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000448
Georg Brandlc6fdec62006-10-28 13:10:17 +0000449 def testClassAndGlobal(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000450
Georg Brandlc6fdec62006-10-28 13:10:17 +0000451 exec """\
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000452def test(x):
453 class Foo:
454 global x
455 def __call__(self, y):
456 return x + y
457 return Foo()
458
459x = 0
Georg Brandlc6fdec62006-10-28 13:10:17 +0000460self.assertEqual(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000461x = -1
Georg Brandlc6fdec62006-10-28 13:10:17 +0000462self.assertEqual(test(3)(2), 5)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000463
Neil Schemenauerd403c452005-10-23 04:24:49 +0000464looked_up_by_load_name = False
465class X:
466 # Implicit globals inside classes are be looked up by LOAD_NAME, not
467 # LOAD_GLOBAL.
468 locals()['looked_up_by_load_name'] = True
469 passed = looked_up_by_load_name
470
Georg Brandlc6fdec62006-10-28 13:10:17 +0000471self.assert_(X.passed)
472"""
Neil Schemenauerd403c452005-10-23 04:24:49 +0000473
Georg Brandlc6fdec62006-10-28 13:10:17 +0000474 def testLocalsFunction(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000475
Georg Brandlc6fdec62006-10-28 13:10:17 +0000476 def f(x):
477 def g(y):
478 def h(z):
479 return y + z
480 w = x + y
481 y += 3
482 return locals()
483 return g
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000484
Georg Brandlc6fdec62006-10-28 13:10:17 +0000485 d = f(2)(4)
Ezio Melottiee1e2c92010-08-03 06:37:50 +0000486 self.assertTrue('h' in d)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000487 del d['h']
488 self.assertEqual(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000489
Jeremy Hylton759410b2007-02-26 18:41:18 +0000490 def testLocalsClass(self):
491 # This test verifies that calling locals() does not pollute
492 # the local namespace of the class with free variables. Old
493 # versions of Python had a bug, where a free variable being
494 # passed through a class namespace would be inserted into
495 # locals() by locals() or exec or a trace function.
496 #
497 # The real bug lies in frame code that copies variables
498 # between fast locals and the locals dict, e.g. when executing
499 # a trace function.
500
501 def f(x):
502 class C:
503 x = 12
504 def m(self):
505 return x
506 locals()
507 return C
508
509 self.assertEqual(f(1).x, 12)
510
511 def f(x):
512 class C:
513 y = x
514 def m(self):
515 return x
516 z = list(locals())
517 return C
518
519 varnames = f(1).z
520 self.assert_("x" not in varnames)
521 self.assert_("y" in varnames)
522
Amaury Forgeot d'Arce4921fe2008-07-21 22:00:38 +0000523 def testLocalsClass_WithTrace(self):
524 # Issue23728: after the trace function returns, the locals()
525 # dictionary is used to update all variables, this used to
526 # include free variables. But in class statements, free
527 # variables are not inserted...
528 import sys
529 sys.settrace(lambda a,b,c:None)
530 try:
531 x = 12
532
533 class C:
534 def f(self):
535 return x
536
Benjamin Petersonf5574a02008-07-21 22:05:34 +0000537 self.assertEquals(x, 12) # Used to raise UnboundLocalError
Amaury Forgeot d'Arce4921fe2008-07-21 22:00:38 +0000538 finally:
539 sys.settrace(None)
540
Georg Brandlc6fdec62006-10-28 13:10:17 +0000541 def testBoundAndFree(self):
542 # var is bound and free in class
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000543
Georg Brandlc6fdec62006-10-28 13:10:17 +0000544 def f(x):
545 class C:
546 def m(self):
547 return x
548 a = x
549 return C
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000550
Georg Brandlc6fdec62006-10-28 13:10:17 +0000551 inst = f(3)()
552 self.assertEqual(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000553
Georg Brandlc6fdec62006-10-28 13:10:17 +0000554 def testInteractionWithTraceFunc(self):
Jeremy Hylton4c889012001-05-08 04:08:59 +0000555
Georg Brandlc6fdec62006-10-28 13:10:17 +0000556 import sys
557 def tracer(a,b,c):
558 return tracer
Jeremy Hylton4c889012001-05-08 04:08:59 +0000559
Georg Brandlc6fdec62006-10-28 13:10:17 +0000560 def adaptgetter(name, klass, getter):
561 kind, des = getter
562 if kind == 1: # AV happens when stepping from this line to next
563 if des == "":
564 des = "_%s__%s" % (klass.__name__, name)
565 return lambda obj: getattr(obj, des)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000566
Georg Brandlc6fdec62006-10-28 13:10:17 +0000567 class TestClass:
568 pass
Jeremy Hylton4c889012001-05-08 04:08:59 +0000569
Georg Brandlc6fdec62006-10-28 13:10:17 +0000570 sys.settrace(tracer)
571 adaptgetter("foo", TestClass, (1, ""))
572 sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000573
Georg Brandlc6fdec62006-10-28 13:10:17 +0000574 self.assertRaises(TypeError, sys.settrace)
Neal Norwitz290d31e2002-03-03 15:12:58 +0000575
Georg Brandlc6fdec62006-10-28 13:10:17 +0000576 def testEvalExecFreeVars(self):
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000577
Georg Brandlc6fdec62006-10-28 13:10:17 +0000578 def f(x):
579 return lambda: x + 1
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000580
Georg Brandlc6fdec62006-10-28 13:10:17 +0000581 g = f(3)
582 self.assertRaises(TypeError, eval, g.func_code)
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000583
Georg Brandlc6fdec62006-10-28 13:10:17 +0000584 try:
585 exec g.func_code in {}
586 except TypeError:
587 pass
588 else:
589 self.fail("exec should have failed, because code contained free vars")
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000590
Georg Brandlc6fdec62006-10-28 13:10:17 +0000591 def testListCompLocalVars(self):
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000592
Georg Brandlc6fdec62006-10-28 13:10:17 +0000593 try:
594 print bad
595 except NameError:
596 pass
597 else:
598 print "bad should not be defined"
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000599
Georg Brandlc6fdec62006-10-28 13:10:17 +0000600 def x():
601 [bad for s in 'a b' for bad in s.split()]
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000602
Georg Brandlc6fdec62006-10-28 13:10:17 +0000603 x()
604 try:
605 print bad
606 except NameError:
607 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000608
Georg Brandlc6fdec62006-10-28 13:10:17 +0000609 def testEvalFreeVars(self):
Jeremy Hylton954aed82002-04-20 04:51:39 +0000610
Georg Brandlc6fdec62006-10-28 13:10:17 +0000611 def f(x):
612 def g():
613 x
614 eval("x + 1")
615 return g
Jeremy Hylton954aed82002-04-20 04:51:39 +0000616
Georg Brandlc6fdec62006-10-28 13:10:17 +0000617 f(4)()
618
Amaury Forgeot d'Arc632fad32008-02-16 20:55:24 +0000619 def testFreeingCell(self):
620 # Test what happens when a finalizer accesses
621 # the cell where the object was stored.
622 class Special:
623 def __del__(self):
624 nestedcell_get()
625
626 def f():
627 global nestedcell_get
628 def nestedcell_get():
629 return c
630
631 c = (Special(),)
632 c = 2
633
634 f() # used to crash the interpreter...
635
Jeremy Hyltoncfb3d332009-03-31 14:30:05 +0000636 def testGlobalInParallelNestedFunctions(self):
637 # A symbol table bug leaked the global statement from one
638 # function to other nested functions in the same block.
639 # This test verifies that a global statement in the first
640 # function does not affect the second function.
641 CODE = """def f():
642 y = 1
643 def g():
644 global y
645 return y
646 def h():
647 return y + 1
648 return g, h
649
650y = 9
651g, h = f()
652result9 = g()
653result2 = h()
654"""
655 local_ns = {}
656 global_ns = {}
657 exec CODE in local_ns, global_ns
658 self.assertEqual(2, global_ns["result2"])
659 self.assertEqual(9, global_ns["result9"])
Amaury Forgeot d'Arc632fad32008-02-16 20:55:24 +0000660
Georg Brandlc6fdec62006-10-28 13:10:17 +0000661
662def test_main():
Ezio Melottiee1e2c92010-08-03 06:37:50 +0000663 with check_warnings(("import \* only allowed at module level",
664 SyntaxWarning)):
665 run_unittest(ScopeTests)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000666
667if __name__ == '__main__':
668 test_main()