update test cases for recent compiler changes: exec/import * in nested
functinos and cell vars with */** parameters
diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py
index 4f3c1ff..a58be00 100644
--- a/Lib/test/test_scope.py
+++ b/Lib/test/test_scope.py
@@ -185,44 +185,64 @@
else:
raise TestFailed
-# XXX for now, it is easiest to call this a syntax error:
-# explicit is better than implicit...
-test1 = \
-"""def unoptimized_clash1(strip):
+check_syntax("""def unoptimized_clash1(strip):
def f(s):
from string import *
return strip(s) # ambiguity: free or local
return f
-"""
-check_syntax(test1)
+""")
-# a little harder to reject this one, but possible...
-test2 = \
-"""def unoptimized_clash2():
+check_syntax("""def unoptimized_clash2():
from string import *
def f(s):
return strip(s) # ambiguity: global or local
return f
-"""
-# check_syntax(test2)
+""")
-# XXX could allow this for exec with const argument, but what's the point
-test3 = \
-"""def error(y):
+check_syntax("""def unoptimized_clash2():
+ from string import *
+ def g():
+ def f(s):
+ return strip(s) # ambiguity: global or local
+ return f
+""")
+
+# XXX could allow this for exec with const argument, but what's the point
+check_syntax("""def error(y):
exec "a = 1"
def f(x):
return x + y
return f
-"""
-check_syntax(test3)
+""")
-test4 = \
-"""def f(x):
+check_syntax("""def f(x):
def g():
return x
- del x
-"""
-check_syntax(test4)
+ del x # can't del name
+""")
+
+check_syntax("""def f():
+ def g():
+ from string import *
+ return strip # global or local?
+""")
+
+# and verify a few cases that should work
+
+def noproblem1():
+ from string import *
+ f = lambda x:x
+
+def noproblem2():
+ from string import *
+ def f(x):
+ return x + 1
+
+def noproblem3():
+ from string import *
+ def f(x):
+ global y
+ y = x
print "12. lambdas"
@@ -275,3 +295,26 @@
pass
else:
raise TestFailed
+
+print "14. complex definitions"
+
+def makeReturner(*lst):
+ def returner():
+ return lst
+ return returner
+
+verify(makeReturner(1,2,3)() == (1,2,3))
+
+def makeReturner2(**kwargs):
+ def returner():
+ return kwargs
+ return returner
+
+verify(makeReturner2(a=11)()['a'] == 11)
+
+def makeAddPair((a, b)):
+ def addPair((c, d)):
+ return (a + c, b + d)
+ return addPair
+
+verify(makeAddPair((1, 2))((100, 200)) == (101,202))