blob: f37254c9df9533a29a35ae8310b2ebaf794a8011 [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
302print "14. complex definitions"
303
304def makeReturner(*lst):
305 def returner():
306 return lst
307 return returner
Tim Peters0e6d2132001-02-15 23:56:39 +0000308
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000309vereq(makeReturner(1,2,3)(), (1,2,3))
Tim Peters0e6d2132001-02-15 23:56:39 +0000310
Jeremy Hylton97a01672001-02-09 22:56:46 +0000311def makeReturner2(**kwargs):
312 def returner():
313 return kwargs
314 return returner
315
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000316vereq(makeReturner2(a=11)()['a'], 11)
Jeremy Hylton97a01672001-02-09 22:56:46 +0000317
318def makeAddPair((a, b)):
319 def addPair((c, d)):
320 return (a + c, b + d)
321 return addPair
322
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323vereq(makeAddPair((1, 2))((100, 200)), (101,202))
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000324
325print "15. scope of global statements"
326# Examples posted by Samuele Pedroni to python-dev on 3/1/2001
327
328# I
329x = 7
330def f():
331 x = 1
332 def g():
333 global x
334 def i():
335 def h():
336 return x
337 return h()
338 return i()
339 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000340vereq(f(), 7)
341vereq(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000342
343# II
344x = 7
345def f():
346 x = 1
347 def g():
348 x = 2
349 def i():
350 def h():
351 return x
352 return h()
353 return i()
354 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000355vereq(f(), 2)
356vereq(x, 7)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000357
358# III
359x = 7
360def f():
361 x = 1
362 def g():
363 global x
364 x = 2
365 def i():
366 def h():
367 return x
368 return h()
369 return i()
370 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000371vereq(f(), 2)
372vereq(x, 2)
Guido van Rossum9aa643c2001-03-01 20:35:45 +0000373
374# IV
375x = 7
376def f():
377 x = 3
378 def g():
379 global x
380 x = 2
381 def i():
382 def h():
383 return x
384 return h()
385 return i()
386 return g()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387vereq(f(), 2)
388vereq(x, 2)
389
390# XXX what about global statements in class blocks?
391# do they affect methods?
392
393x = 12
394class Global:
395 global x
396 x = 13
397 def set(self, val):
398 x = val
399 def get(self):
400 return x
401
402g = Global()
403vereq(g.get(), 13)
404g.set(15)
405vereq(g.get(), 13)
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000406
407print "16. check leaks"
408
409class Foo:
410 count = 0
Tim Peters30edd232001-03-16 08:29:48 +0000411
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000412 def __init__(self):
413 Foo.count += 1
414
415 def __del__(self):
416 Foo.count -= 1
417
418def f1():
419 x = Foo()
420 def f2():
421 return x
422 f2()
Tim Peters30edd232001-03-16 08:29:48 +0000423
Jeremy Hylton5b44a672001-03-13 02:01:12 +0000424for i in range(100):
425 f1()
426
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427vereq(Foo.count, 0)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000428
429print "17. class and global"
430
431def test(x):
432 class Foo:
433 global x
434 def __call__(self, y):
435 return x + y
436 return Foo()
437
438x = 0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439vereq(test(6)(2), 8)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000440x = -1
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000441vereq(test(3)(2), 5)
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000442
Neil Schemenauerd403c452005-10-23 04:24:49 +0000443looked_up_by_load_name = False
444class X:
445 # Implicit globals inside classes are be looked up by LOAD_NAME, not
446 # LOAD_GLOBAL.
447 locals()['looked_up_by_load_name'] = True
448 passed = looked_up_by_load_name
449
450verify(X.passed)
451
Jeremy Hylton5c7a2512001-03-21 16:44:39 +0000452print "18. verify that locals() works"
453
454def f(x):
455 def g(y):
456 def h(z):
457 return y + z
458 w = x + y
459 y += 3
460 return locals()
461 return g
462
463d = f(2)(4)
464verify(d.has_key('h'))
465del d['h']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466vereq(d, {'x': 2, 'y': 7, 'w': 6})
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000467
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +0000468print "19. var is bound and free in class"
469
470def f(x):
471 class C:
472 def m(self):
473 return x
474 a = x
475 return C
476
477inst = f(3)()
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478vereq(inst.a, inst.m())
Jeremy Hylton4c889012001-05-08 04:08:59 +0000479
480print "20. interaction with trace function"
481
482import sys
483def tracer(a,b,c):
484 return tracer
485
486def adaptgetter(name, klass, getter):
487 kind, des = getter
488 if kind == 1: # AV happens when stepping from this line to next
489 if des == "":
Jeremy Hyltonf36cfef2001-12-13 20:00:26 +0000490 des = "_%s__%s" % (klass.__name__, name)
Jeremy Hylton4c889012001-05-08 04:08:59 +0000491 return lambda obj: getattr(obj, des)
492
493class TestClass:
494 pass
495
496sys.settrace(tracer)
497adaptgetter("foo", TestClass, (1, ""))
498sys.settrace(None)
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000499
Neal Norwitz290d31e2002-03-03 15:12:58 +0000500try: sys.settrace()
501except TypeError: pass
502else: raise TestFailed, 'sys.settrace() did not raise TypeError'
503
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000504print "20. eval and exec with free variables"
Jeremy Hylton5121e7d2001-07-30 21:55:29 +0000505
506def f(x):
507 return lambda: x + 1
508
509g = f(3)
510try:
511 eval(g.func_code)
512except TypeError:
513 pass
514else:
515 print "eval() should have failed, because code contained free vars"
Jeremy Hyltoncd738362001-08-07 16:38:19 +0000516
Jeremy Hyltonccae83772001-12-13 19:45:04 +0000517try:
518 exec g.func_code
519except TypeError:
520 pass
521else:
522 print "exec should have failed, because code contained free vars"
523
Jeremy Hyltoncf672f12001-10-18 16:23:11 +0000524print "21. list comprehension with local variables"
525
526try:
527 print bad
528except NameError:
529 pass
530else:
531 print "bad should not be defined"
532
533def x():
534 [bad for s in 'a b' for bad in s.split()]
535
536x()
537try:
538 print bad
539except NameError:
540 pass
Jeremy Hylton954aed82002-04-20 04:51:39 +0000541
542print "22. eval with free variables"
543
544def f(x):
545 def g():
546 x
547 eval("x + 1")
548 return g
549
550f(4)()