blob: 259d1d90049efa9d0b24af6725f7c51b990e9746 [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):
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000190 from sys import *
191 return getrefcount(s) # ambiguity: free or local
Jeremy Hylton4588c782001-01-25 20:11:23 +0000192 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():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000197 from sys import *
Jeremy Hylton4588c782001-01-25 20:11:23 +0000198 def f(s):
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000199 return getrefcount(s) # ambiguity: global or local
Jeremy Hylton4588c782001-01-25 20:11:23 +0000200 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():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000205 from sys import *
Jeremy Hylton97a01672001-02-09 22:56:46 +0000206 def g():
207 def f(s):
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000208 return getrefcount(s) # ambiguity: global or local
Jeremy Hylton97a01672001-02-09 22:56:46 +0000209 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():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000222 from sys import *
223 return getrefcount # 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():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000230 from sys import *
Jeremy Hylton97a01672001-02-09 22:56:46 +0000231 f = lambda x:x
232
233def noproblem2():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000234 from sys import *
Jeremy Hylton97a01672001-02-09 22:56:46 +0000235 def f(x):
236 return x + 1
237
238def noproblem3():
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000239 from sys import *
Jeremy Hylton97a01672001-02-09 22:56:46 +0000240 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 testScopeOfGlobalStmt(self):
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000327# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
328
Thomas Wouters89f507f2006-12-13 04:49:30 +0000329 exec("""\
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000330# I
331x = 7
332def f():
333 x = 1
334 def g():
335 global x
336 def i():
337 def h():
338 return x
339 return h()
340 return i()
341 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000342self.assertEqual(f(), 7)
343self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000344
345# II
346x = 7
347def f():
348 x = 1
349 def g():
350 x = 2
351 def i():
352 def h():
353 return x
354 return h()
355 return i()
356 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000357self.assertEqual(f(), 2)
358self.assertEqual(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000359
360# III
361x = 7
362def f():
363 x = 1
364 def g():
365 global x
366 x = 2
367 def i():
368 def h():
369 return x
370 return h()
371 return i()
372 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000373self.assertEqual(f(), 2)
374self.assertEqual(x, 2)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000375
376# IV
377x = 7
378def f():
379 x = 3
380 def g():
381 global x
382 x = 2
383 def i():
384 def h():
385 return x
386 return h()
387 return i()
388 return g()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000389self.assertEqual(f(), 2)
390self.assertEqual(x, 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000391
392# XXX what about global statements in class blocks?
393# do they affect methods?
394
395x = 12
396class Global:
397 global x
398 x = 13
399 def set(self, val):
400 x = val
401 def get(self):
402 return x
403
404g = Global()
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405self.assertEqual(g.get(), 13)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000406g.set(15)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000407self.assertEqual(g.get(), 13)
408""")
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000409
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410 def testLeaks(self):
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000411
Thomas Wouters89f507f2006-12-13 04:49:30 +0000412 class Foo:
413 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000414
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 def __init__(self):
416 Foo.count += 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000417
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 def __del__(self):
419 Foo.count -= 1
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000420
Thomas Wouters89f507f2006-12-13 04:49:30 +0000421 def f1():
422 x = Foo()
423 def f2():
424 return x
425 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000426
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427 for i in range(100):
428 f1()
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000429
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430 self.assertEqual(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000431
Thomas Wouters89f507f2006-12-13 04:49:30 +0000432 def testClassAndGlobal(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000433
Thomas Wouters89f507f2006-12-13 04:49:30 +0000434 exec("""\
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000435def test(x):
436 class Foo:
437 global x
438 def __call__(self, y):
439 return x + y
440 return Foo()
441
442x = 0
Thomas Wouters89f507f2006-12-13 04:49:30 +0000443self.assertEqual(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000444x = -1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000445self.assertEqual(test(3)(2), 5)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000446
Neil Schemenauerd403c452005-10-23 04:24:49 +0000447looked_up_by_load_name = False
448class X:
449 # Implicit globals inside classes are be looked up by LOAD_NAME, not
450 # LOAD_GLOBAL.
451 locals()['looked_up_by_load_name'] = True
452 passed = looked_up_by_load_name
453
Thomas Wouters89f507f2006-12-13 04:49:30 +0000454self.assert_(X.passed)
455""")
Neil Schemenauerd403c452005-10-23 04:24:49 +0000456
Thomas Wouters89f507f2006-12-13 04:49:30 +0000457 def testLocalsFunction(self):
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000458
Thomas Wouters89f507f2006-12-13 04:49:30 +0000459 def f(x):
460 def g(y):
461 def h(z):
462 return y + z
463 w = x + y
464 y += 3
465 return locals()
466 return g
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000467
Thomas Wouters89f507f2006-12-13 04:49:30 +0000468 d = f(2)(4)
469 self.assert_('h' in d)
470 del d['h']
471 self.assertEqual(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000472
Guido van Rossumd8faa362007-04-27 19:54:29 +0000473 def testLocalsClass(self):
474 # This test verifies that calling locals() does not pollute
475 # the local namespace of the class with free variables. Old
476 # versions of Python had a bug, where a free variable being
477 # passed through a class namespace would be inserted into
478 # locals() by locals() or exec or a trace function.
479 #
480 # The real bug lies in frame code that copies variables
481 # between fast locals and the locals dict, e.g. when executing
482 # a trace function.
483
484 def f(x):
485 class C:
486 x = 12
487 def m(self):
488 return x
489 locals()
490 return C
491
492 self.assertEqual(f(1).x, 12)
493
494 def f(x):
495 class C:
496 y = x
497 def m(self):
498 return x
499 z = list(locals())
500 return C
501
502 varnames = f(1).z
503 self.assert_("x" not in varnames)
504 self.assert_("y" in varnames)
505
Thomas Wouters89f507f2006-12-13 04:49:30 +0000506 def testBoundAndFree(self):
507 # var is bound and free in class
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000508
Thomas Wouters89f507f2006-12-13 04:49:30 +0000509 def f(x):
510 class C:
511 def m(self):
512 return x
513 a = x
514 return C
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000515
Thomas Wouters89f507f2006-12-13 04:49:30 +0000516 inst = f(3)()
517 self.assertEqual(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000518
Thomas Wouters89f507f2006-12-13 04:49:30 +0000519 def testInteractionWithTraceFunc(self):
Jeremy Hylton4c889012001-05-08 04:08:59 +0000520
Thomas Wouters89f507f2006-12-13 04:49:30 +0000521 import sys
522 def tracer(a,b,c):
523 return tracer
Jeremy Hylton4c889012001-05-08 04:08:59 +0000524
Thomas Wouters89f507f2006-12-13 04:49:30 +0000525 def adaptgetter(name, klass, getter):
526 kind, des = getter
527 if kind == 1: # AV happens when stepping from this line to next
528 if des == "":
529 des = "_%s__%s" % (klass.__name__, name)
530 return lambda obj: getattr(obj, des)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000531
Thomas Wouters89f507f2006-12-13 04:49:30 +0000532 class TestClass:
533 pass
Jeremy Hylton4c889012001-05-08 04:08:59 +0000534
Thomas Wouters89f507f2006-12-13 04:49:30 +0000535 sys.settrace(tracer)
536 adaptgetter("foo", TestClass, (1, ""))
537 sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000538
Thomas Wouters89f507f2006-12-13 04:49:30 +0000539 self.assertRaises(TypeError, sys.settrace)
Neal Norwitz290d31e2002-03-03 15:12:58 +0000540
Thomas Wouters89f507f2006-12-13 04:49:30 +0000541 def testEvalExecFreeVars(self):
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000542
Thomas Wouters89f507f2006-12-13 04:49:30 +0000543 def f(x):
544 return lambda: x + 1
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000545
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 g = f(3)
Neal Norwitz221085d2007-02-25 20:55:47 +0000547 self.assertRaises(TypeError, eval, g.__code__)
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000548
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 try:
Neal Norwitz221085d2007-02-25 20:55:47 +0000550 exec(g.__code__, {})
Thomas Wouters89f507f2006-12-13 04:49:30 +0000551 except TypeError:
552 pass
553 else:
554 self.fail("exec should have failed, because code contained free vars")
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000555
Thomas Wouters89f507f2006-12-13 04:49:30 +0000556 def testListCompLocalVars(self):
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000557
Thomas Wouters89f507f2006-12-13 04:49:30 +0000558 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000559 print(bad)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000560 except NameError:
561 pass
562 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000563 print("bad should not be defined")
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000564
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 def x():
566 [bad for s in 'a b' for bad in s.split()]
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000567
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 x()
569 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000570 print(bad)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 except NameError:
572 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000573
Thomas Wouters89f507f2006-12-13 04:49:30 +0000574 def testEvalFreeVars(self):
Jeremy Hylton954aed82002-04-20 04:51:39 +0000575
Thomas Wouters89f507f2006-12-13 04:49:30 +0000576 def f(x):
577 def g():
578 x
579 eval("x + 1")
580 return g
Jeremy Hylton954aed82002-04-20 04:51:39 +0000581
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 f(4)()
583
Jeremy Hylton81e95022007-02-27 06:50:52 +0000584 def testNonLocalFunction(self):
585
586 def f(x):
587 def inc():
588 nonlocal x
589 x += 1
590 return x
591 def dec():
592 nonlocal x
593 x -= 1
594 return x
595 return inc, dec
596
597 inc, dec = f(0)
598 self.assertEqual(inc(), 1)
599 self.assertEqual(inc(), 2)
600 self.assertEqual(dec(), 1)
601 self.assertEqual(dec(), 0)
602
603 def testNonLocalMethod(self):
604
605 def f(x):
606 class c:
607 def inc(self):
608 nonlocal x
609 x += 1
610 return x
611 def dec(self):
612 nonlocal x
613 x -= 1
614 return x
615 return c()
616
617 c = f(0)
618 self.assertEqual(c.inc(), 1)
619 self.assertEqual(c.inc(), 2)
620 self.assertEqual(c.dec(), 1)
621 self.assertEqual(c.dec(), 0)
622
623 def testNonLocalClass(self):
624
625 def f(x):
626 class c:
627 nonlocal x
628 x += 1
629 def get(self):
630 return x
631 return c()
632
633 c = f(0)
634 self.assertEqual(c.get(), 1)
635 self.assert_("x" not in c.__class__.__dict__)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000636
Jeremy Hylton81e95022007-02-27 06:50:52 +0000637
638 def testNonLocalGenerator(self):
639
640 def f(x):
641 def g(y):
642 nonlocal x
643 for i in range(y):
644 x += 1
645 yield x
646 return g
647
648 g = f(0)
649 self.assertEqual(list(g(5)), [1, 2, 3, 4, 5])
650
651 def testNestedNonLocal(self):
652
653 def f(x):
654 def g():
655 nonlocal x
656 x -= 2
657 def h():
658 nonlocal x
659 x += 4
660 return x
661 return h
662 return g
663
664 g = f(1)
665 h = g()
666 self.assertEqual(h(), 3)
667
Thomas Wouters89f507f2006-12-13 04:49:30 +0000668
669def test_main():
670 run_unittest(ScopeTests)
671
672if __name__ == '__main__':
673 test_main()