blob: 239745c613fe3e80f9a2c17c3084f9d02940d08a [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 Peters0e6d2132001-02-15 23:56:39 +0000208# XXX could allow this for exec with const argument, but what's the point
Tim Petersc4889c42001-07-12 22:36:02 +0000209check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000210def error(y):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000211 exec "a = 1"
212 def f(x):
213 return x + y
214 return f
Jeremy Hylton97a01672001-02-09 22:56:46 +0000215""")
Jeremy Hylton4588c782001-01-25 20:11:23 +0000216
Tim Petersc4889c42001-07-12 22:36:02 +0000217check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000218def f(x):
Jeremy Hylton4588c782001-01-25 20:11:23 +0000219 def g():
220 return x
Jeremy Hylton97a01672001-02-09 22:56:46 +0000221 del x # can't del name
222""")
223
Tim Petersc4889c42001-07-12 22:36:02 +0000224check_syntax("""\
Jeremy Hylton5941d192001-02-27 20:23:58 +0000225def f():
Jeremy Hylton97a01672001-02-09 22:56:46 +0000226 def g():
227 from string import *
228 return strip # global or local?
Tim Peters0e6d2132001-02-15 23:56:39 +0000229""")
Jeremy Hylton97a01672001-02-09 22:56:46 +0000230
231# and verify a few cases that should work
232
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000233exec """
Jeremy Hylton97a01672001-02-09 22:56:46 +0000234def noproblem1():
235 from string import *
236 f = lambda x:x
237
238def noproblem2():
239 from string import *
240 def f(x):
241 return x + 1
242
243def noproblem3():
244 from string import *
245 def f(x):
246 global y
247 y = x
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000248"""
Jeremy Hylton4588c782001-01-25 20:11:23 +0000249
250print "12. lambdas"
251
252f1 = lambda x: lambda y: x + y
253inc = f1(1)
254plus10 = f1(10)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255vereq(inc(1), 2)
256vereq(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000257
258f2 = lambda x: (lambda : lambda y: x + y)()
259inc = f2(1)
260plus10 = f2(10)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261vereq(inc(1), 2)
262vereq(plus10(5), 15)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000263
264f3 = lambda x: lambda y: global_x + y
265global_x = 1
266inc = f3(None)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267vereq(inc(2), 3)
Jeremy Hylton4588c782001-01-25 20:11:23 +0000268
269f8 = lambda x, y, z: lambda a, b, c: lambda : z * (b + y)
270g = f8(1, 2, 3)
271h = g(2, 4, 6)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000272vereq(h(), 18)
Jeremy Hyltonde602482001-02-05 17:35:20 +0000273
274print "13. UnboundLocal"
275
276def errorInOuter():
277 print y
278 def inner():
279 return y
280 y = 1
281
282def errorInInner():
283 def inner():
284 return y
285 inner()
286 y = 1
287
288try:
289 errorInOuter()
290except UnboundLocalError:
291 pass
292else:
293 raise TestFailed
294
295try:
296 errorInInner()
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000297except NameError:
Jeremy Hyltonde602482001-02-05 17:35:20 +0000298 pass
299else:
300 raise TestFailed
Jeremy Hylton97a01672001-02-09 22:56:46 +0000301
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000302# test for bug #1501934: incorrect LOAD/STORE_GLOBAL generation
303global_x = 1
304def f():
305 global_x += 1
306try:
307 f()
308except UnboundLocalError:
309 pass
310else:
311 raise TestFailed, 'scope of global_x not correctly determined'
312
Jeremy Hylton97a01672001-02-09 22:56:46 +0000313print "14. complex definitions"
314
315def makeReturner(*lst):
316 def returner():
317 return lst
318 return returner
Tim Peters0e6d2132001-02-15 23:56:39 +0000319
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320vereq(makeReturner(1,2,3)(), (1,2,3))
Tim Peters0e6d2132001-02-15 23:56:39 +0000321
Jeremy Hylton97a01672001-02-09 22:56:46 +0000322def makeReturner2(**kwargs):
323 def returner():
324 return kwargs
325 return returner
326
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327vereq(makeReturner2(a=11)()['a'], 11)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000328
329def makeAddPair((a, b)):
330 def addPair((c, d)):
331 return (a + c, b + d)
332 return addPair
333
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000334vereq(makeAddPair((1, 2))((100, 200)), (101,202))
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000335
336print "15. scope of global statements"
337# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
338
339# I
340x = 7
341def f():
342 x = 1
343 def g():
344 global x
345 def i():
346 def h():
347 return x
348 return h()
349 return i()
350 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000351vereq(f(), 7)
352vereq(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000353
354# II
355x = 7
356def f():
357 x = 1
358 def g():
359 x = 2
360 def i():
361 def h():
362 return x
363 return h()
364 return i()
365 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000366vereq(f(), 2)
367vereq(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000368
369# III
370x = 7
371def f():
372 x = 1
373 def g():
374 global x
375 x = 2
376 def i():
377 def h():
378 return x
379 return h()
380 return i()
381 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382vereq(f(), 2)
383vereq(x, 2)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000384
385# IV
386x = 7
387def f():
388 x = 3
389 def g():
390 global x
391 x = 2
392 def i():
393 def h():
394 return x
395 return h()
396 return i()
397 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398vereq(f(), 2)
399vereq(x, 2)
400
401# XXX what about global statements in class blocks?
402# do they affect methods?
403
404x = 12
405class Global:
406 global x
407 x = 13
408 def set(self, val):
409 x = val
410 def get(self):
411 return x
412
413g = Global()
414vereq(g.get(), 13)
415g.set(15)
416vereq(g.get(), 13)
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000417
418print "16. check leaks"
419
420class Foo:
421 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000422
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000423 def __init__(self):
424 Foo.count += 1
425
426 def __del__(self):
427 Foo.count -= 1
428
429def f1():
430 x = Foo()
431 def f2():
432 return x
433 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000434
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000435for i in range(100):
436 f1()
437
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438vereq(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000439
440print "17. class and global"
441
442def test(x):
443 class Foo:
444 global x
445 def __call__(self, y):
446 return x + y
447 return Foo()
448
449x = 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000450vereq(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000451x = -1
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000452vereq(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
461verify(X.passed)
462
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000463print "18. verify that locals() works"
464
465def 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
473
474d = f(2)(4)
475verify(d.has_key('h'))
476del d['h']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000477vereq(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000478
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000479print "19. var is bound and free in class"
480
481def f(x):
482 class C:
483 def m(self):
484 return x
485 a = x
486 return C
487
488inst = f(3)()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489vereq(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000490
491print "20. interaction with trace function"
492
493import sys
494def tracer(a,b,c):
495 return tracer
496
497def adaptgetter(name, klass, getter):
498 kind, des = getter
499 if kind == 1: # AV happens when stepping from this line to next
500 if des == "":
Jeremy Hyltonf36cfef2001-12-13 20:00:26 +0000501 des = "_%s__%s" % (klass.__name__, name)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000502 return lambda obj: getattr(obj, des)
503
504class TestClass:
505 pass
506
507sys.settrace(tracer)
508adaptgetter("foo", TestClass, (1, ""))
509sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000510
Neal Norwitz290d31e2002-03-03 15:12:58 +0000511try: sys.settrace()
512except TypeError: pass
513else: raise TestFailed, 'sys.settrace() did not raise TypeError'
514
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000515print "20. eval and exec with free variables"
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000516
517def f(x):
518 return lambda: x + 1
519
520g = f(3)
521try:
522 eval(g.func_code)
523except TypeError:
524 pass
525else:
526 print "eval() should have failed, because code contained free vars"
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000527
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000528try:
529 exec g.func_code
530except TypeError:
531 pass
532else:
533 print "exec should have failed, because code contained free vars"
534
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000535print "21. list comprehension with local variables"
536
537try:
538 print bad
539except NameError:
540 pass
541else:
542 print "bad should not be defined"
543
544def x():
545 [bad for s in 'a b' for bad in s.split()]
546
547x()
548try:
549 print bad
550except NameError:
551 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000552
553print "22. eval with free variables"
554
555def f(x):
556 def g():
557 x
558 eval("x + 1")
559 return g
560
561f(4)()