blob: 94583e192a82c279eaac75c80d9e0010474c3d4f [file] [log] [blame]
Georg Brandlc6fdec62006-10-28 13:10:17 +00001import unittest
Florent Xiclunabc27c6a2010-03-19 18:34:55 +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
Benjamin Peterson50a22522009-07-02 22:56:16 +0000290 self.assertRaises(UnboundLocalError, errorInOuter)
291 self.assertRaises(NameError, errorInInner)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000292
Georg Brandlc6fdec62006-10-28 13:10:17 +0000293 # test for bug #1501934: incorrect LOAD/STORE_GLOBAL generation
294 exec """
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000295global_x = 1
296def f():
297 global_x += 1
298try:
299 f()
300except UnboundLocalError:
301 pass
302else:
Georg Brandlc6fdec62006-10-28 13:10:17 +0000303 fail('scope of global_x not correctly determined')
304""" in {'fail': self.fail}
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000305
Georg Brandlc6fdec62006-10-28 13:10:17 +0000306 def testComplexDefinitions(self):
Jeremy Hylton97a01672001-02-09 22:56:46 +0000307
Georg Brandlc6fdec62006-10-28 13:10:17 +0000308 def makeReturner(*lst):
309 def returner():
310 return lst
311 return returner
Tim Peters0e6d2132001-02-15 23:56:39 +0000312
Georg Brandlc6fdec62006-10-28 13:10:17 +0000313 self.assertEqual(makeReturner(1,2,3)(), (1,2,3))
Tim Peters0e6d2132001-02-15 23:56:39 +0000314
Georg Brandlc6fdec62006-10-28 13:10:17 +0000315 def makeReturner2(**kwargs):
316 def returner():
317 return kwargs
318 return returner
Jeremy Hylton97a01672001-02-09 22:56:46 +0000319
Georg Brandlc6fdec62006-10-28 13:10:17 +0000320 self.assertEqual(makeReturner2(a=11)()['a'], 11)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000321
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000322 with check_py3k_warnings(("tuple parameter unpacking has been removed",
323 SyntaxWarning)):
324 exec """\
325def makeAddPair((a, b)):
326 def addPair((c, d)):
327 return (a + c, b + d)
328 return addPair
329""" in locals()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000330 self.assertEqual(makeAddPair((1, 2))((100, 200)), (101,202))
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000331
Georg Brandlc6fdec62006-10-28 13:10:17 +0000332 def testScopeOfGlobalStmt(self):
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000333# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
334
Georg Brandlc6fdec62006-10-28 13:10:17 +0000335 exec """\
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000336# I
337x = 7
338def f():
339 x = 1
340 def g():
341 global x
342 def i():
343 def h():
344 return x
345 return h()
346 return i()
347 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000348self.assertEqual(f(), 7)
349self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000350
351# II
352x = 7
353def f():
354 x = 1
355 def g():
356 x = 2
357 def i():
358 def h():
359 return x
360 return h()
361 return i()
362 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000363self.assertEqual(f(), 2)
364self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000365
366# III
367x = 7
368def f():
369 x = 1
370 def g():
371 global x
372 x = 2
373 def i():
374 def h():
375 return x
376 return h()
377 return i()
378 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000379self.assertEqual(f(), 2)
380self.assertEqual(x, 2)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000381
382# IV
383x = 7
384def f():
385 x = 3
386 def g():
387 global x
388 x = 2
389 def i():
390 def h():
391 return x
392 return h()
393 return i()
394 return g()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000395self.assertEqual(f(), 2)
396self.assertEqual(x, 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397
398# XXX what about global statements in class blocks?
399# do they affect methods?
400
401x = 12
402class Global:
403 global x
404 x = 13
405 def set(self, val):
406 x = val
407 def get(self):
408 return x
409
410g = Global()
Georg Brandlc6fdec62006-10-28 13:10:17 +0000411self.assertEqual(g.get(), 13)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412g.set(15)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000413self.assertEqual(g.get(), 13)
414"""
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000415
Georg Brandlc6fdec62006-10-28 13:10:17 +0000416 def testLeaks(self):
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000417
Georg Brandlc6fdec62006-10-28 13:10:17 +0000418 class Foo:
419 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000420
Georg Brandlc6fdec62006-10-28 13:10:17 +0000421 def __init__(self):
422 Foo.count += 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000423
Georg Brandlc6fdec62006-10-28 13:10:17 +0000424 def __del__(self):
425 Foo.count -= 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000426
Georg Brandlc6fdec62006-10-28 13:10:17 +0000427 def f1():
428 x = Foo()
429 def f2():
430 return x
431 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000432
Georg Brandlc6fdec62006-10-28 13:10:17 +0000433 for i in range(100):
434 f1()
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000435
Georg Brandlc6fdec62006-10-28 13:10:17 +0000436 self.assertEqual(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000437
Georg Brandlc6fdec62006-10-28 13:10:17 +0000438 def testClassAndGlobal(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000439
Georg Brandlc6fdec62006-10-28 13:10:17 +0000440 exec """\
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000441def test(x):
442 class Foo:
443 global x
444 def __call__(self, y):
445 return x + y
446 return Foo()
447
448x = 0
Georg Brandlc6fdec62006-10-28 13:10:17 +0000449self.assertEqual(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000450x = -1
Georg Brandlc6fdec62006-10-28 13:10:17 +0000451self.assertEqual(test(3)(2), 5)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000452
Neil Schemenauerd403c452005-10-23 04:24:49 +0000453looked_up_by_load_name = False
454class X:
455 # Implicit globals inside classes are be looked up by LOAD_NAME, not
456 # LOAD_GLOBAL.
457 locals()['looked_up_by_load_name'] = True
458 passed = looked_up_by_load_name
459
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000460self.assertTrue(X.passed)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000461"""
Neil Schemenauerd403c452005-10-23 04:24:49 +0000462
Georg Brandlc6fdec62006-10-28 13:10:17 +0000463 def testLocalsFunction(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000464
Georg Brandlc6fdec62006-10-28 13:10:17 +0000465 def f(x):
466 def g(y):
467 def h(z):
468 return y + z
469 w = x + y
470 y += 3
471 return locals()
472 return g
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000473
Georg Brandlc6fdec62006-10-28 13:10:17 +0000474 d = f(2)(4)
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000475 self.assertIn('h', d)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000476 del d['h']
477 self.assertEqual(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000478
Jeremy Hylton759410b2007-02-26 18:41:18 +0000479 def testLocalsClass(self):
480 # This test verifies that calling locals() does not pollute
481 # the local namespace of the class with free variables. Old
482 # versions of Python had a bug, where a free variable being
483 # passed through a class namespace would be inserted into
484 # locals() by locals() or exec or a trace function.
485 #
486 # The real bug lies in frame code that copies variables
487 # between fast locals and the locals dict, e.g. when executing
488 # a trace function.
489
490 def f(x):
491 class C:
492 x = 12
493 def m(self):
494 return x
495 locals()
496 return C
497
498 self.assertEqual(f(1).x, 12)
499
500 def f(x):
501 class C:
502 y = x
503 def m(self):
504 return x
505 z = list(locals())
506 return C
507
508 varnames = f(1).z
Ezio Melottiaa980582010-01-23 23:04:36 +0000509 self.assertNotIn("x", varnames)
510 self.assertIn("y", varnames)
Jeremy Hylton759410b2007-02-26 18:41:18 +0000511
Amaury Forgeot d'Arce4921fe2008-07-21 22:00:38 +0000512 def testLocalsClass_WithTrace(self):
513 # Issue23728: after the trace function returns, the locals()
514 # dictionary is used to update all variables, this used to
515 # include free variables. But in class statements, free
516 # variables are not inserted...
517 import sys
518 sys.settrace(lambda a,b,c:None)
519 try:
520 x = 12
521
522 class C:
523 def f(self):
524 return x
525
Ezio Melotti2623a372010-11-21 13:34:58 +0000526 self.assertEqual(x, 12) # Used to raise UnboundLocalError
Amaury Forgeot d'Arce4921fe2008-07-21 22:00:38 +0000527 finally:
528 sys.settrace(None)
529
Georg Brandlc6fdec62006-10-28 13:10:17 +0000530 def testBoundAndFree(self):
531 # var is bound and free in class
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000532
Georg Brandlc6fdec62006-10-28 13:10:17 +0000533 def f(x):
534 class C:
535 def m(self):
536 return x
537 a = x
538 return C
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000539
Georg Brandlc6fdec62006-10-28 13:10:17 +0000540 inst = f(3)()
541 self.assertEqual(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000542
Georg Brandlc6fdec62006-10-28 13:10:17 +0000543 def testInteractionWithTraceFunc(self):
Jeremy Hylton4c889012001-05-08 04:08:59 +0000544
Georg Brandlc6fdec62006-10-28 13:10:17 +0000545 import sys
546 def tracer(a,b,c):
547 return tracer
Jeremy Hylton4c889012001-05-08 04:08:59 +0000548
Georg Brandlc6fdec62006-10-28 13:10:17 +0000549 def adaptgetter(name, klass, getter):
550 kind, des = getter
551 if kind == 1: # AV happens when stepping from this line to next
552 if des == "":
553 des = "_%s__%s" % (klass.__name__, name)
554 return lambda obj: getattr(obj, des)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000555
Georg Brandlc6fdec62006-10-28 13:10:17 +0000556 class TestClass:
557 pass
Jeremy Hylton4c889012001-05-08 04:08:59 +0000558
Georg Brandlc6fdec62006-10-28 13:10:17 +0000559 sys.settrace(tracer)
560 adaptgetter("foo", TestClass, (1, ""))
561 sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000562
Georg Brandlc6fdec62006-10-28 13:10:17 +0000563 self.assertRaises(TypeError, sys.settrace)
Neal Norwitz290d31e2002-03-03 15:12:58 +0000564
Georg Brandlc6fdec62006-10-28 13:10:17 +0000565 def testEvalExecFreeVars(self):
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000566
Georg Brandlc6fdec62006-10-28 13:10:17 +0000567 def f(x):
568 return lambda: x + 1
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000569
Georg Brandlc6fdec62006-10-28 13:10:17 +0000570 g = f(3)
571 self.assertRaises(TypeError, eval, g.func_code)
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000572
Georg Brandlc6fdec62006-10-28 13:10:17 +0000573 try:
574 exec g.func_code in {}
575 except TypeError:
576 pass
577 else:
578 self.fail("exec should have failed, because code contained free vars")
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000579
Georg Brandlc6fdec62006-10-28 13:10:17 +0000580 def testListCompLocalVars(self):
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000581
Georg Brandlc6fdec62006-10-28 13:10:17 +0000582 try:
583 print bad
584 except NameError:
585 pass
586 else:
587 print "bad should not be defined"
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000588
Georg Brandlc6fdec62006-10-28 13:10:17 +0000589 def x():
590 [bad for s in 'a b' for bad in s.split()]
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000591
Georg Brandlc6fdec62006-10-28 13:10:17 +0000592 x()
593 try:
594 print bad
595 except NameError:
596 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000597
Georg Brandlc6fdec62006-10-28 13:10:17 +0000598 def testEvalFreeVars(self):
Jeremy Hylton954aed82002-04-20 04:51:39 +0000599
Georg Brandlc6fdec62006-10-28 13:10:17 +0000600 def f(x):
601 def g():
602 x
603 eval("x + 1")
604 return g
Jeremy Hylton954aed82002-04-20 04:51:39 +0000605
Georg Brandlc6fdec62006-10-28 13:10:17 +0000606 f(4)()
607
Amaury Forgeot d'Arc632fad32008-02-16 20:55:24 +0000608 def testFreeingCell(self):
609 # Test what happens when a finalizer accesses
610 # the cell where the object was stored.
611 class Special:
612 def __del__(self):
613 nestedcell_get()
614
615 def f():
616 global nestedcell_get
617 def nestedcell_get():
618 return c
619
620 c = (Special(),)
621 c = 2
622
623 f() # used to crash the interpreter...
624
Jeremy Hylton88f1c042009-03-31 13:48:15 +0000625 def testGlobalInParallelNestedFunctions(self):
626 # A symbol table bug leaked the global statement from one
627 # function to other nested functions in the same block.
628 # This test verifies that a global statement in the first
629 # function does not affect the second function.
630 CODE = """def f():
631 y = 1
632 def g():
633 global y
634 return y
635 def h():
636 return y + 1
637 return g, h
638
639y = 9
640g, h = f()
641result9 = g()
642result2 = h()
643"""
644 local_ns = {}
645 global_ns = {}
646 exec CODE in local_ns, global_ns
647 self.assertEqual(2, global_ns["result2"])
648 self.assertEqual(9, global_ns["result9"])
Amaury Forgeot d'Arc632fad32008-02-16 20:55:24 +0000649
Benjamin Petersonf76942d2010-10-16 03:51:38 +0000650 def testTopIsNotSignificant(self):
651 # See #9997.
652 def top(a):
653 pass
654 def b():
655 global a
656
Georg Brandlc6fdec62006-10-28 13:10:17 +0000657
658def test_main():
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000659 with check_warnings(("import \* only allowed at module level",
660 SyntaxWarning)):
661 run_unittest(ScopeTests)
Georg Brandlc6fdec62006-10-28 13:10:17 +0000662
663if __name__ == '__main__':
664 test_main()