blob: e4e592ae02ac98e90bba4d9344bccaa6569d5c54 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001from test.test_support import verify, TestFailed, check_syntax, vereq
Jeremy Hylton4588c782001-01-25 20:11:23 +00002
Jeremy Hyltoncd738362001-08-07 16:38:19 +00003import warnings
Guido van Rossum796e1e02001-12-15 18:04:10 +00004warnings.filterwarnings("ignore", r"import \*", SyntaxWarning, "<string>")
Jeremy Hyltoncd738362001-08-07 16:38:19 +00005
Jeremy Hylton4588c782001-01-25 20:11:23 +00006print "1. simple nesting"
7
8def make_adder(x):
9 def adder(y):
10 return x + y
11 return adder
12
13inc = make_adder(1)
14plus10 = make_adder(10)
15
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000016vereq(inc(1), 2)
17vereq(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000018
19print "2. extra nesting"
20
21def make_adder2(x):
22 def extra(): # check freevars passing through non-use scopes
23 def adder(y):
24 return x + y
25 return adder
26 return extra()
27
28inc = make_adder2(1)
29plus10 = make_adder2(10)
30
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000031vereq(inc(1), 2)
32vereq(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000033
34print "3. simple nesting + rebinding"
35
36def make_adder3(x):
37 def adder(y):
38 return x + y
39 x = x + 1 # check tracking of assignment to x in defining scope
40 return adder
41
42inc = make_adder3(0)
43plus10 = make_adder3(9)
44
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045vereq(inc(1), 2)
46vereq(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000047
48print "4. nesting with global but no free"
49
50def make_adder4(): # XXX add exta level of indirection
51 def nest():
52 def nest():
53 def adder(y):
54 return global_x + y # check that plain old globals work
55 return adder
56 return nest()
57 return nest()
58
59global_x = 1
60adder = make_adder4()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000061vereq(adder(1), 2)
Jeremy Hylton4588c782001-01-25 20:11:23 +000062
63global_x = 10
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000064vereq(adder(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000065
66print "5. nesting through class"
67
68def make_adder5(x):
69 class Adder:
70 def __call__(self, y):
71 return x + y
72 return Adder()
73
74inc = make_adder5(1)
75plus10 = make_adder5(10)
76
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077vereq(inc(1), 2)
78vereq(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000079
80print "6. nesting plus free ref to global"
81
82def make_adder6(x):
83 global global_nest_x
84 def adder(y):
85 return global_nest_x + y
86 global_nest_x = x
87 return adder
88
89inc = make_adder6(1)
90plus10 = make_adder6(10)
91
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092vereq(inc(1), 11) # there's only one global
93vereq(plus10(-2), 8)
Jeremy Hylton4588c782001-01-25 20:11:23 +000094
95print "7. nearest enclosing scope"
96
97def f(x):
98 def g(y):
99 x = 42 # check that this masks binding in f()
100 def h(z):
101 return x + z
102 return h
103 return g(2)
104
105test_func = f(10)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106vereq(test_func(5), 47)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000107
108print "8. mixed freevars and cellvars"
109
110def identity(x):
Tim Peters10fb3862001-02-09 20:17:14 +0000111 return x
Jeremy Hylton4588c782001-01-25 20:11:23 +0000112
113def f(x, y, z):
114 def g(a, b, c):
115 a = a + x # 3
116 def h():
Tim Peters10fb3862001-02-09 20:17:14 +0000117 # z * (4 + 9)
118 # 3 * 13
Jeremy Hylton4588c782001-01-25 20:11:23 +0000119 return identity(z * (b + y))
120 y = c + z # 9
121 return h
122 return g
123
124g = f(1, 2, 3)
125h = g(2, 4, 6)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126vereq(h(), 39)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000127
128print "9. free variable in method"
129
130def test():
131 method_and_var = "var"
132 class Test:
133 def method_and_var(self):
134 return "method"
135 def test(self):
136 return method_and_var
137 def actual_global(self):
138 return str("global")
139 def str(self):
140 return str(self)
141 return Test()
142
143t = test()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000144vereq(t.test(), "var")
145vereq(t.method_and_var(), "method")
146vereq(t.actual_global(), "global")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000147
148method_and_var = "var"
149class Test:
150 # this class is not nested, so the rules are different
151 def method_and_var(self):
152 return "method"
153 def test(self):
154 return method_and_var
155 def actual_global(self):
156 return str("global")
157 def str(self):
158 return str(self)
159
Jeremy Hyltonde602482001-02-05 17:35:20 +0000160t = Test()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000161vereq(t.test(), "var")
162vereq(t.method_and_var(), "method")
163vereq(t.actual_global(), "global")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000164
165print "10. recursion"
166
167def f(x):
168 def fact(n):
169 if n == 0:
170 return 1
171 else:
172 return n * fact(n - 1)
173 if x >= 0:
174 return fact(x)
175 else:
176 raise ValueError, "x must be >= 0"
177
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000178vereq(f(6), 720)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000179
180
181print "11. unoptimized namespaces"
182
Tim Petersc4889c42001-07-12 22:36:02 +0000183check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000184def unoptimized_clash1(strip):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000185 def f(s):
186 from string import *
187 return strip(s) # ambiguity: free or local
188 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000189""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000190
Tim Petersc4889c42001-07-12 22:36:02 +0000191check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000192def unoptimized_clash2():
Jeremy Hylton4588c782001-01-25 20:11:23 +0000193 from string import *
194 def f(s):
195 return strip(s) # ambiguity: global or local
196 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000197""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000198
Tim Petersc4889c42001-07-12 22:36:02 +0000199check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000200def unoptimized_clash2():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000201 from string import *
202 def g():
203 def f(s):
204 return strip(s) # ambiguity: global or local
205 return f
206""")
207
Tim Petersc4889c42001-07-12 22:36:02 +0000208check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000209def f(x):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000210 def g():
211 return x
Jeremy Hylton97a01672001-02-09 22:56:46 +0000212 del x # can't del name
213""")
214
Tim Petersc4889c42001-07-12 22:36:02 +0000215check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000216def f():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000217 def g():
218 from string import *
219 return strip # global or local?
Tim Peters0e6d2132001-02-15 23:56:39 +0000220""")
Jeremy Hylton97a01672001-02-09 22:56:46 +0000221
222# and verify a few cases that should work
223
Georg Brandl7cae87c2006-09-06 06:51:57 +0000224exec("""
Jeremy Hylton97a01672001-02-09 22:56:46 +0000225def noproblem1():
226 from string import *
227 f = lambda x:x
228
229def noproblem2():
230 from string import *
231 def f(x):
232 return x + 1
233
234def noproblem3():
235 from string import *
236 def f(x):
237 global y
238 y = x
Georg Brandl7cae87c2006-09-06 06:51:57 +0000239""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000240
241print "12. lambdas"
242
243f1 = lambda x: lambda y: x + y
244inc = f1(1)
245plus10 = f1(10)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246vereq(inc(1), 2)
247vereq(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000248
249f2 = lambda x: (lambda : lambda y: x + y)()
250inc = f2(1)
251plus10 = f2(10)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252vereq(inc(1), 2)
253vereq(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000254
255f3 = lambda x: lambda y: global_x + y
256global_x = 1
257inc = f3(None)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258vereq(inc(2), 3)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000259
260f8 = lambda x, y, z: lambda a, b, c: lambda : z * (b + y)
261g = f8(1, 2, 3)
262h = g(2, 4, 6)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000263vereq(h(), 18)
Jeremy Hyltonde602482001-02-05 17:35:20 +0000264
265print "13. UnboundLocal"
266
267def errorInOuter():
268 print y
269 def inner():
270 return y
271 y = 1
272
273def errorInInner():
274 def inner():
275 return y
276 inner()
277 y = 1
278
279try:
280 errorInOuter()
281except UnboundLocalError:
282 pass
283else:
284 raise TestFailed
285
286try:
287 errorInInner()
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000288except NameError:
Jeremy Hyltonde602482001-02-05 17:35:20 +0000289 pass
290else:
291 raise TestFailed
Jeremy Hylton97a01672001-02-09 22:56:46 +0000292
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000293# test for bug #1501934: incorrect LOAD/STORE_GLOBAL generation
294global_x = 1
295def f():
296 global_x += 1
297try:
298 f()
299except UnboundLocalError:
300 pass
301else:
302 raise TestFailed, 'scope of global_x not correctly determined'
303
Jeremy Hylton97a01672001-02-09 22:56:46 +0000304print "14. complex definitions"
305
306def makeReturner(*lst):
307 def returner():
308 return lst
309 return returner
Tim Peters0e6d2132001-02-15 23:56:39 +0000310
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311vereq(makeReturner(1,2,3)(), (1,2,3))
Tim Peters0e6d2132001-02-15 23:56:39 +0000312
Jeremy Hylton97a01672001-02-09 22:56:46 +0000313def makeReturner2(**kwargs):
314 def returner():
315 return kwargs
316 return returner
317
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318vereq(makeReturner2(a=11)()['a'], 11)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000319
320def makeAddPair((a, b)):
321 def addPair((c, d)):
322 return (a + c, b + d)
323 return addPair
324
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325vereq(makeAddPair((1, 2))((100, 200)), (101,202))
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000326
327print "15. scope of global statements"
328# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
329
330# 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()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000342vereq(f(), 7)
343vereq(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()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000357vereq(f(), 2)
358vereq(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()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373vereq(f(), 2)
374vereq(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()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389vereq(f(), 2)
390vereq(x, 2)
391
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()
405vereq(g.get(), 13)
406g.set(15)
407vereq(g.get(), 13)
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000408
409print "16. check leaks"
410
411class Foo:
412 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000413
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000414 def __init__(self):
415 Foo.count += 1
416
417 def __del__(self):
418 Foo.count -= 1
419
420def f1():
421 x = Foo()
422 def f2():
423 return x
424 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000425
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000426for i in range(100):
427 f1()
428
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429vereq(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000430
431print "17. class and global"
432
433def test(x):
434 class Foo:
435 global x
436 def __call__(self, y):
437 return x + y
438 return Foo()
439
440x = 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000441vereq(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000442x = -1
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443vereq(test(3)(2), 5)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000444
Neil Schemenauerd403c452005-10-23 04:24:49 +0000445looked_up_by_load_name = False
446class X:
447 # Implicit globals inside classes are be looked up by LOAD_NAME, not
448 # LOAD_GLOBAL.
449 locals()['looked_up_by_load_name'] = True
450 passed = looked_up_by_load_name
451
452verify(X.passed)
453
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000454print "18. verify that locals() works"
455
456def f(x):
457 def g(y):
458 def h(z):
459 return y + z
460 w = x + y
461 y += 3
462 return locals()
463 return g
464
465d = f(2)(4)
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000466verify('h' in d)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000467del d['h']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000468vereq(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000469
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000470print "19. var is bound and free in class"
471
472def f(x):
473 class C:
474 def m(self):
475 return x
476 a = x
477 return C
478
479inst = f(3)()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000480vereq(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000481
482print "20. interaction with trace function"
483
484import sys
485def tracer(a,b,c):
486 return tracer
487
488def adaptgetter(name, klass, getter):
489 kind, des = getter
490 if kind == 1: # AV happens when stepping from this line to next
491 if des == "":
Jeremy Hyltonf36cfef2001-12-13 20:00:26 +0000492 des = "_%s__%s" % (klass.__name__, name)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000493 return lambda obj: getattr(obj, des)
494
495class TestClass:
496 pass
497
498sys.settrace(tracer)
499adaptgetter("foo", TestClass, (1, ""))
500sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000501
Neal Norwitz290d31e2002-03-03 15:12:58 +0000502try: sys.settrace()
503except TypeError: pass
504else: raise TestFailed, 'sys.settrace() did not raise TypeError'
505
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000506print "20. eval and exec with free variables"
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000507
508def f(x):
509 return lambda: x + 1
510
511g = f(3)
512try:
513 eval(g.func_code)
514except TypeError:
515 pass
516else:
517 print "eval() should have failed, because code contained free vars"
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000518
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000519try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000520 exec(g.func_code)
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000521except TypeError:
522 pass
523else:
524 print "exec should have failed, because code contained free vars"
525
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000526print "21. list comprehension with local variables"
527
528try:
529 print bad
530except NameError:
531 pass
532else:
533 print "bad should not be defined"
534
535def x():
536 [bad for s in 'a b' for bad in s.split()]
537
538x()
539try:
540 print bad
541except NameError:
542 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000543
544print "22. eval with free variables"
545
546def f(x):
547 def g():
548 x
549 eval("x + 1")
550 return g
551
552f(4)()