blob: 5fe1bc7c026c94168e1e369e28ea5d91ec3af792 [file] [log] [blame]
Thomas Wouters89f507f2006-12-13 04:49:30 +00001import unittest
2from test.test_support import check_syntax_error, run_unittest
Jeremy Hylton4588c782001-01-25 20:11:23 +00003
Jeremy Hyltoncd738362001-08-07 16:38:19 +00004import warnings
Thomas Wouters89f507f2006-12-13 04:49:30 +00005warnings.filterwarnings("ignore", r"import \*", SyntaxWarning, "<test string>")
Guido van Rossum796e1e02001-12-15 18:04:10 +00006warnings.filterwarnings("ignore", r"import \*", SyntaxWarning, "<string>")
Jeremy Hyltoncd738362001-08-07 16:38:19 +00007
Thomas Wouters89f507f2006-12-13 04:49:30 +00008class ScopeTests(unittest.TestCase):
Jeremy Hylton4588c782001-01-25 20:11:23 +00009
Thomas Wouters89f507f2006-12-13 04:49:30 +000010 def testSimpleNesting(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000011
Thomas Wouters89f507f2006-12-13 04:49:30 +000012 def make_adder(x):
Jeremy Hylton4588c782001-01-25 20:11:23 +000013 def adder(y):
Thomas Wouters89f507f2006-12-13 04:49:30 +000014 return x + y
Jeremy Hylton4588c782001-01-25 20:11:23 +000015 return adder
Jeremy Hylton4588c782001-01-25 20:11:23 +000016
Thomas Wouters89f507f2006-12-13 04:49:30 +000017 inc = make_adder(1)
18 plus10 = make_adder(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000019
Thomas Wouters89f507f2006-12-13 04:49:30 +000020 self.assertEqual(inc(1), 2)
21 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000022
Thomas Wouters89f507f2006-12-13 04:49:30 +000023 def testExtraNesting(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000024
Thomas Wouters89f507f2006-12-13 04:49:30 +000025 def make_adder2(x):
26 def extra(): # check freevars passing through non-use scopes
27 def adder(y):
28 return x + y
29 return adder
30 return extra()
Jeremy Hylton4588c782001-01-25 20:11:23 +000031
Thomas Wouters89f507f2006-12-13 04:49:30 +000032 inc = make_adder2(1)
33 plus10 = make_adder2(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000034
Thomas Wouters89f507f2006-12-13 04:49:30 +000035 self.assertEqual(inc(1), 2)
36 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000037
Thomas Wouters89f507f2006-12-13 04:49:30 +000038 def testSimpleAndRebinding(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000039
Thomas Wouters89f507f2006-12-13 04:49:30 +000040 def make_adder3(x):
41 def adder(y):
42 return x + y
43 x = x + 1 # check tracking of assignment to x in defining scope
44 return adder
Jeremy Hylton4588c782001-01-25 20:11:23 +000045
Thomas Wouters89f507f2006-12-13 04:49:30 +000046 inc = make_adder3(0)
47 plus10 = make_adder3(9)
Jeremy Hylton4588c782001-01-25 20:11:23 +000048
Thomas Wouters89f507f2006-12-13 04:49:30 +000049 self.assertEqual(inc(1), 2)
50 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000051
Thomas Wouters89f507f2006-12-13 04:49:30 +000052 def testNestingGlobalNoFree(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000053
Thomas Wouters89f507f2006-12-13 04:49:30 +000054 def make_adder4(): # XXX add exta level of indirection
55 def nest():
56 def nest():
57 def adder(y):
58 return global_x + y # check that plain old globals work
59 return adder
60 return nest()
61 return nest()
Jeremy Hylton4588c782001-01-25 20:11:23 +000062
Thomas Wouters89f507f2006-12-13 04:49:30 +000063 global_x = 1
64 adder = make_adder4()
65 self.assertEqual(adder(1), 2)
Jeremy Hylton4588c782001-01-25 20:11:23 +000066
Thomas Wouters89f507f2006-12-13 04:49:30 +000067 global_x = 10
68 self.assertEqual(adder(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000069
Thomas Wouters89f507f2006-12-13 04:49:30 +000070 def testNestingThroughClass(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000071
Thomas Wouters89f507f2006-12-13 04:49:30 +000072 def make_adder5(x):
73 class Adder:
74 def __call__(self, y):
75 return x + y
76 return Adder()
Jeremy Hylton4588c782001-01-25 20:11:23 +000077
Thomas Wouters89f507f2006-12-13 04:49:30 +000078 inc = make_adder5(1)
79 plus10 = make_adder5(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000080
Thomas Wouters89f507f2006-12-13 04:49:30 +000081 self.assertEqual(inc(1), 2)
82 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000083
Thomas Wouters89f507f2006-12-13 04:49:30 +000084 def testNestingPlusFreeRefToGlobal(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +000085
Thomas Wouters89f507f2006-12-13 04:49:30 +000086 def make_adder6(x):
87 global global_nest_x
88 def adder(y):
89 return global_nest_x + y
90 global_nest_x = x
91 return adder
Jeremy Hylton4588c782001-01-25 20:11:23 +000092
Thomas Wouters89f507f2006-12-13 04:49:30 +000093 inc = make_adder6(1)
94 plus10 = make_adder6(10)
Jeremy Hylton4588c782001-01-25 20:11:23 +000095
Thomas Wouters89f507f2006-12-13 04:49:30 +000096 self.assertEqual(inc(1), 11) # there's only one global
97 self.assertEqual(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000098
Thomas Wouters89f507f2006-12-13 04:49:30 +000099 def testNearestEnclosingScope(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000100
Thomas Wouters89f507f2006-12-13 04:49:30 +0000101 def f(x):
102 def g(y):
103 x = 42 # check that this masks binding in f()
104 def h(z):
105 return x + z
106 return h
107 return g(2)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000108
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 test_func = f(10)
110 self.assertEqual(test_func(5), 47)
111
112 def testMixedFreevarsAndCellvars(self):
113
114 def identity(x):
115 return x
116
117 def f(x, y, z):
118 def g(a, b, c):
119 a = a + x # 3
120 def h():
121 # z * (4 + 9)
122 # 3 * 13
123 return identity(z * (b + y))
124 y = c + z # 9
125 return h
126 return g
127
128 g = f(1, 2, 3)
129 h = g(2, 4, 6)
130 self.assertEqual(h(), 39)
131
132 def testFreeVarInMethod(self):
133
134 def test():
135 method_and_var = "var"
136 class Test:
137 def method_and_var(self):
138 return "method"
139 def test(self):
140 return method_and_var
141 def actual_global(self):
142 return str("global")
143 def str(self):
144 return str(self)
145 return Test()
146
147 t = test()
148 self.assertEqual(t.test(), "var")
149 self.assertEqual(t.method_and_var(), "method")
150 self.assertEqual(t.actual_global(), "global")
151
152 method_and_var = "var"
153 class Test:
154 # this class is not nested, so the rules are different
155 def method_and_var(self):
156 return "method"
157 def test(self):
158 return method_and_var
159 def actual_global(self):
160 return str("global")
161 def str(self):
162 return str(self)
163
164 t = Test()
165 self.assertEqual(t.test(), "var")
166 self.assertEqual(t.method_and_var(), "method")
167 self.assertEqual(t.actual_global(), "global")
168
169 def testRecursion(self):
170
171 def f(x):
172 def fact(n):
173 if n == 0:
174 return 1
175 else:
176 return n * fact(n - 1)
177 if x >= 0:
178 return fact(x)
179 else:
180 raise ValueError, "x must be >= 0"
181
182 self.assertEqual(f(6), 720)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000183
184
Thomas Wouters89f507f2006-12-13 04:49:30 +0000185 def testUnoptimizedNamespaces(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000186
Thomas Wouters89f507f2006-12-13 04:49:30 +0000187 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000188def unoptimized_clash1(strip):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000189 def f(s):
190 from string import *
191 return strip(s) # ambiguity: free or local
192 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000193""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000194
Thomas Wouters89f507f2006-12-13 04:49:30 +0000195 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000196def unoptimized_clash2():
Jeremy Hylton4588c782001-01-25 20:11:23 +0000197 from string import *
198 def f(s):
199 return strip(s) # ambiguity: global or local
200 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000201""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000202
Thomas Wouters89f507f2006-12-13 04:49:30 +0000203 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000204def unoptimized_clash2():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000205 from string import *
206 def g():
207 def f(s):
208 return strip(s) # ambiguity: global or local
209 return f
210""")
211
Thomas Wouters89f507f2006-12-13 04:49:30 +0000212 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000213def f(x):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000214 def g():
215 return x
Jeremy Hylton97a01672001-02-09 22:56:46 +0000216 del x # can't del name
217""")
218
Thomas Wouters89f507f2006-12-13 04:49:30 +0000219 check_syntax_error(self, """\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000220def f():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000221 def g():
Thomas Wouters89f507f2006-12-13 04:49:30 +0000222 from string import *
223 return strip # global or local?
Tim Peters0e6d2132001-02-15 23:56:39 +0000224""")
Jeremy Hylton97a01672001-02-09 22:56:46 +0000225
Thomas Wouters89f507f2006-12-13 04:49:30 +0000226 # and verify a few cases that should work
Jeremy Hylton97a01672001-02-09 22:56:46 +0000227
Thomas Wouters89f507f2006-12-13 04:49:30 +0000228 exec("""
Jeremy Hylton97a01672001-02-09 22:56:46 +0000229def noproblem1():
230 from string import *
231 f = lambda x:x
232
233def noproblem2():
234 from string import *
235 def f(x):
236 return x + 1
237
238def noproblem3():
239 from string import *
240 def f(x):
241 global y
242 y = x
Georg Brandl7cae87c2006-09-06 06:51:57 +0000243""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000244
Thomas Wouters89f507f2006-12-13 04:49:30 +0000245 def testLambdas(self):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000246
Thomas Wouters89f507f2006-12-13 04:49:30 +0000247 f1 = lambda x: lambda y: x + y
248 inc = f1(1)
249 plus10 = f1(10)
250 self.assertEqual(inc(1), 2)
251 self.assertEqual(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000252
Thomas Wouters89f507f2006-12-13 04:49:30 +0000253 f2 = lambda x: (lambda : lambda y: x + y)()
254 inc = f2(1)
255 plus10 = f2(10)
256 self.assertEqual(inc(1), 2)
257 self.assertEqual(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000258
Thomas Wouters89f507f2006-12-13 04:49:30 +0000259 f3 = lambda x: lambda y: global_x + y
260 global_x = 1
261 inc = f3(None)
262 self.assertEqual(inc(2), 3)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000263
Thomas Wouters89f507f2006-12-13 04:49:30 +0000264 f8 = lambda x, y, z: lambda a, b, c: lambda : z * (b + y)
265 g = f8(1, 2, 3)
266 h = g(2, 4, 6)
267 self.assertEqual(h(), 18)
Jeremy Hyltonde602482001-02-05 17:35:20 +0000268
Thomas Wouters89f507f2006-12-13 04:49:30 +0000269 def testUnboundLocal(self):
Jeremy Hyltonde602482001-02-05 17:35:20 +0000270
Thomas Wouters89f507f2006-12-13 04:49:30 +0000271 def errorInOuter():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000272 print(y)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000273 def inner():
274 return y
275 y = 1
Jeremy Hyltonde602482001-02-05 17:35:20 +0000276
Thomas Wouters89f507f2006-12-13 04:49:30 +0000277 def errorInInner():
278 def inner():
279 return y
280 inner()
281 y = 1
Jeremy Hyltonde602482001-02-05 17:35:20 +0000282
Thomas Wouters89f507f2006-12-13 04:49:30 +0000283 try:
284 errorInOuter()
285 except UnboundLocalError:
286 pass
287 else:
288 self.fail()
Jeremy Hyltonde602482001-02-05 17:35:20 +0000289
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 try:
291 errorInInner()
292 except NameError:
293 pass
294 else:
295 self.fail()
Jeremy Hylton97a01672001-02-09 22:56:46 +0000296
Thomas Wouters89f507f2006-12-13 04:49:30 +0000297 # test for bug #1501934: incorrect LOAD/STORE_GLOBAL generation
298 exec("""
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000299global_x = 1
300def f():
301 global_x += 1
302try:
303 f()
304except UnboundLocalError:
305 pass
306else:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000307 fail('scope of global_x not correctly determined')
308""", {'fail': self.fail})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309
Thomas Wouters89f507f2006-12-13 04:49:30 +0000310 def testComplexDefinitions(self):
Jeremy Hylton97a01672001-02-09 22:56:46 +0000311
Thomas Wouters89f507f2006-12-13 04:49:30 +0000312 def makeReturner(*lst):
313 def returner():
314 return lst
315 return returner
Tim Peters0e6d2132001-02-15 23:56:39 +0000316
Thomas Wouters89f507f2006-12-13 04:49:30 +0000317 self.assertEqual(makeReturner(1,2,3)(), (1,2,3))
Tim Peters0e6d2132001-02-15 23:56:39 +0000318
Thomas Wouters89f507f2006-12-13 04:49:30 +0000319 def makeReturner2(**kwargs):
320 def returner():
321 return kwargs
322 return returner
Jeremy Hylton97a01672001-02-09 22:56:46 +0000323
Thomas Wouters89f507f2006-12-13 04:49:30 +0000324 self.assertEqual(makeReturner2(a=11)()['a'], 11)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000325
Thomas Wouters89f507f2006-12-13 04:49:30 +0000326 def makeAddPair((a, b)):
327 def addPair((c, d)):
328 return (a + c, b + d)
329 return addPair
Jeremy Hylton97a01672001-02-09 22:56:46 +0000330
Thomas Wouters89f507f2006-12-13 04:49:30 +0000331 self.assertEqual(makeAddPair((1, 2))((100, 200)), (101,202))
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000332
Thomas Wouters89f507f2006-12-13 04:49:30 +0000333 def testScopeOfGlobalStmt(self):
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000334# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
335
Thomas Wouters89f507f2006-12-13 04:49:30 +0000336 exec("""\
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000337# I
338x = 7
339def f():
340 x = 1
341 def g():
342 global x
343 def i():
344 def h():
345 return x
346 return h()
347 return i()
348 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000349self.assertEqual(f(), 7)
350self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000351
352# II
353x = 7
354def f():
355 x = 1
356 def g():
357 x = 2
358 def i():
359 def h():
360 return x
361 return h()
362 return i()
363 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000364self.assertEqual(f(), 2)
365self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000366
367# III
368x = 7
369def f():
370 x = 1
371 def g():
372 global x
373 x = 2
374 def i():
375 def h():
376 return x
377 return h()
378 return i()
379 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000380self.assertEqual(f(), 2)
381self.assertEqual(x, 2)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000382
383# IV
384x = 7
385def f():
386 x = 3
387 def g():
388 global x
389 x = 2
390 def i():
391 def h():
392 return x
393 return h()
394 return i()
395 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000396self.assertEqual(f(), 2)
397self.assertEqual(x, 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399# XXX what about global statements in class blocks?
400# do they affect methods?
401
402x = 12
403class Global:
404 global x
405 x = 13
406 def set(self, val):
407 x = val
408 def get(self):
409 return x
410
411g = Global()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000412self.assertEqual(g.get(), 13)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000413g.set(15)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000414self.assertEqual(g.get(), 13)
415""")
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000416
Thomas Wouters89f507f2006-12-13 04:49:30 +0000417 def testLeaks(self):
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000418
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 class Foo:
420 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000421
Thomas Wouters89f507f2006-12-13 04:49:30 +0000422 def __init__(self):
423 Foo.count += 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000424
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 def __del__(self):
426 Foo.count -= 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000427
Thomas Wouters89f507f2006-12-13 04:49:30 +0000428 def f1():
429 x = Foo()
430 def f2():
431 return x
432 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000433
Thomas Wouters89f507f2006-12-13 04:49:30 +0000434 for i in range(100):
435 f1()
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000436
Thomas Wouters89f507f2006-12-13 04:49:30 +0000437 self.assertEqual(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000438
Thomas Wouters89f507f2006-12-13 04:49:30 +0000439 def testClassAndGlobal(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000440
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441 exec("""\
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000442def test(x):
443 class Foo:
444 global x
445 def __call__(self, y):
446 return x + y
447 return Foo()
448
449x = 0
Thomas Wouters89f507f2006-12-13 04:49:30 +0000450self.assertEqual(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000451x = -1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452self.assertEqual(test(3)(2), 5)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000453
Neil Schemenauerd403c452005-10-23 04:24:49 +0000454looked_up_by_load_name = False
455class X:
456 # Implicit globals inside classes are be looked up by LOAD_NAME, not
457 # LOAD_GLOBAL.
458 locals()['looked_up_by_load_name'] = True
459 passed = looked_up_by_load_name
460
Thomas Wouters89f507f2006-12-13 04:49:30 +0000461self.assert_(X.passed)
462""")
Neil Schemenauerd403c452005-10-23 04:24:49 +0000463
Thomas Wouters89f507f2006-12-13 04:49:30 +0000464 def testLocalsFunction(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000465
Thomas Wouters89f507f2006-12-13 04:49:30 +0000466 def f(x):
467 def g(y):
468 def h(z):
469 return y + z
470 w = x + y
471 y += 3
472 return locals()
473 return g
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000474
Thomas Wouters89f507f2006-12-13 04:49:30 +0000475 d = f(2)(4)
476 self.assert_('h' in d)
477 del d['h']
478 self.assertEqual(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000479
Thomas Wouters89f507f2006-12-13 04:49:30 +0000480 def testBoundAndFree(self):
481 # var is bound and free in class
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000482
Thomas Wouters89f507f2006-12-13 04:49:30 +0000483 def f(x):
484 class C:
485 def m(self):
486 return x
487 a = x
488 return C
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000489
Thomas Wouters89f507f2006-12-13 04:49:30 +0000490 inst = f(3)()
491 self.assertEqual(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000492
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 def testInteractionWithTraceFunc(self):
Jeremy Hylton4c889012001-05-08 04:08:59 +0000494
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 import sys
496 def tracer(a,b,c):
497 return tracer
Jeremy Hylton4c889012001-05-08 04:08:59 +0000498
Thomas Wouters89f507f2006-12-13 04:49:30 +0000499 def adaptgetter(name, klass, getter):
500 kind, des = getter
501 if kind == 1: # AV happens when stepping from this line to next
502 if des == "":
503 des = "_%s__%s" % (klass.__name__, name)
504 return lambda obj: getattr(obj, des)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000505
Thomas Wouters89f507f2006-12-13 04:49:30 +0000506 class TestClass:
507 pass
Jeremy Hylton4c889012001-05-08 04:08:59 +0000508
Thomas Wouters89f507f2006-12-13 04:49:30 +0000509 sys.settrace(tracer)
510 adaptgetter("foo", TestClass, (1, ""))
511 sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000512
Thomas Wouters89f507f2006-12-13 04:49:30 +0000513 self.assertRaises(TypeError, sys.settrace)
Neal Norwitz290d31e2002-03-03 15:12:58 +0000514
Thomas Wouters89f507f2006-12-13 04:49:30 +0000515 def testEvalExecFreeVars(self):
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000516
Thomas Wouters89f507f2006-12-13 04:49:30 +0000517 def f(x):
518 return lambda: x + 1
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000519
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520 g = f(3)
Neal Norwitz221085d2007-02-25 20:55:47 +0000521 self.assertRaises(TypeError, eval, g.__code__)
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000522
Thomas Wouters89f507f2006-12-13 04:49:30 +0000523 try:
Neal Norwitz221085d2007-02-25 20:55:47 +0000524 exec(g.__code__, {})
Thomas Wouters89f507f2006-12-13 04:49:30 +0000525 except TypeError:
526 pass
527 else:
528 self.fail("exec should have failed, because code contained free vars")
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000529
Thomas Wouters89f507f2006-12-13 04:49:30 +0000530 def testListCompLocalVars(self):
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000531
Thomas Wouters89f507f2006-12-13 04:49:30 +0000532 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000533 print(bad)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534 except NameError:
535 pass
536 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000537 print("bad should not be defined")
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000538
Thomas Wouters89f507f2006-12-13 04:49:30 +0000539 def x():
540 [bad for s in 'a b' for bad in s.split()]
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000541
Thomas Wouters89f507f2006-12-13 04:49:30 +0000542 x()
543 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000544 print(bad)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000545 except NameError:
546 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000547
Thomas Wouters89f507f2006-12-13 04:49:30 +0000548 def testEvalFreeVars(self):
Jeremy Hylton954aed82002-04-20 04:51:39 +0000549
Thomas Wouters89f507f2006-12-13 04:49:30 +0000550 def f(x):
551 def g():
552 x
553 eval("x + 1")
554 return g
Jeremy Hylton954aed82002-04-20 04:51:39 +0000555
Thomas Wouters89f507f2006-12-13 04:49:30 +0000556 f(4)()
557
Jeremy Hylton81e95022007-02-27 06:50:52 +0000558 def testNonLocalFunction(self):
559
560 def f(x):
561 def inc():
562 nonlocal x
563 x += 1
564 return x
565 def dec():
566 nonlocal x
567 x -= 1
568 return x
569 return inc, dec
570
571 inc, dec = f(0)
572 self.assertEqual(inc(), 1)
573 self.assertEqual(inc(), 2)
574 self.assertEqual(dec(), 1)
575 self.assertEqual(dec(), 0)
576
577 def testNonLocalMethod(self):
578
579 def f(x):
580 class c:
581 def inc(self):
582 nonlocal x
583 x += 1
584 return x
585 def dec(self):
586 nonlocal x
587 x -= 1
588 return x
589 return c()
590
591 c = f(0)
592 self.assertEqual(c.inc(), 1)
593 self.assertEqual(c.inc(), 2)
594 self.assertEqual(c.dec(), 1)
595 self.assertEqual(c.dec(), 0)
596
597 def testNonLocalClass(self):
598
599 def f(x):
600 class c:
601 nonlocal x
602 x += 1
603 def get(self):
604 return x
605 return c()
606
607 c = f(0)
608 self.assertEqual(c.get(), 1)
609 self.assert_("x" not in c.__class__.__dict__)
610
611
612 def testNonLocalGenerator(self):
613
614 def f(x):
615 def g(y):
616 nonlocal x
617 for i in range(y):
618 x += 1
619 yield x
620 return g
621
622 g = f(0)
623 self.assertEqual(list(g(5)), [1, 2, 3, 4, 5])
624
625 def testNestedNonLocal(self):
626
627 def f(x):
628 def g():
629 nonlocal x
630 x -= 2
631 def h():
632 nonlocal x
633 x += 4
634 return x
635 return h
636 return g
637
638 g = f(1)
639 h = g()
640 self.assertEqual(h(), 3)
641
Thomas Wouters89f507f2006-12-13 04:49:30 +0000642
643def test_main():
644 run_unittest(ScopeTests)
645
646if __name__ == '__main__':
647 test_main()