Skip to content

Commit d96b97a

Browse files
committed
fixed scoping issue, commented test with references to original version
1 parent 2a172a6 commit d96b97a

File tree

2 files changed

+43
-44
lines changed

2 files changed

+43
-44
lines changed

Lib/test/test_named_expression.py

Lines changed: 42 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,122 @@
11
import unittest
22

3-
#This test is only applicable for Python 3.8 and later
4-
53
GLOBAL_VAR = None
64

75
class NamedExpressionInvalidTest(unittest.TestCase):
86

9-
# Test modified to accept syntax error with deviating message
107
def test_named_expression_invalid_01(self):
118
code = """x := 0"""
129

10+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
1311
with self.assertRaises(SyntaxError):
1412
exec(code, {}, {})
1513

16-
# Test modified to accept syntax error with deviating message
1714
def test_named_expression_invalid_02(self):
1815
code = """x = y := 0"""
1916

17+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
2018
with self.assertRaises(SyntaxError):
2119
exec(code, {}, {})
2220

23-
# Test modified to accept syntax error with deviating message
2421
def test_named_expression_invalid_03(self):
2522
code = """y := f(x)"""
2623

24+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
2725
with self.assertRaises(SyntaxError):
2826
exec(code, {}, {})
2927

30-
# Test modified to accept syntax error with deviating message
3128
def test_named_expression_invalid_04(self):
3229
code = """y0 = y1 := f(x)"""
3330

31+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
3432
with self.assertRaises(SyntaxError):
3533
exec(code, {}, {})
3634

37-
# Test modified to accept syntax error with deviating message
3835
def test_named_expression_invalid_06(self):
3936
code = """((a, b) := (1, 2))"""
4037

38+
#with self.assertRaisesRegex(SyntaxError, "cannot use assignment expressions with tuple"): # TODO RustPython
4139
with self.assertRaises(SyntaxError):
4240
exec(code, {}, {})
4341

44-
# Test modified to accept syntax error with deviating message
4542
def test_named_expression_invalid_07(self):
4643
code = """def spam(a = b := 42): pass"""
4744

45+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
4846
with self.assertRaises(SyntaxError):
4947
exec(code, {}, {})
5048

51-
# Test modified to accept syntax error with deviating message
5249
def test_named_expression_invalid_08(self):
5350
code = """def spam(a: b := 42 = 5): pass"""
5451

52+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
5553
with self.assertRaises(SyntaxError):
5654
exec(code, {}, {})
5755

58-
# Test modified to accept syntax error with deviating message
5956
def test_named_expression_invalid_09(self):
6057
code = """spam(a=b := 'c')"""
6158

59+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
6260
with self.assertRaises(SyntaxError):
6361
exec(code, {}, {})
6462

65-
# Test modified to accept syntax error with deviating message
6663
def test_named_expression_invalid_10(self):
6764
code = """spam(x = y := f(x))"""
6865

66+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
6967
with self.assertRaises(SyntaxError):
7068
exec(code, {}, {})
7169

72-
# Test modified to accept syntax error with deviating message
7370
def test_named_expression_invalid_11(self):
7471
code = """spam(a=1, b := 2)"""
7572

73+
#with self.assertRaisesRegex(SyntaxError,
74+
# "positional argument follows keyword argument"): # TODO RustPython
7675
with self.assertRaises(SyntaxError):
7776
exec(code, {}, {})
7877

79-
# Test modified to accept syntax error with deviating message
8078
def test_named_expression_invalid_12(self):
8179
code = """spam(a=1, (b := 2))"""
8280

81+
#with self.assertRaisesRegex(SyntaxError,
82+
# "positional argument follows keyword argument"): # TODO RustPython
8383
with self.assertRaises(SyntaxError):
8484
exec(code, {}, {})
8585

86-
# Test modified to accept syntax error with deviating message
8786
def test_named_expression_invalid_13(self):
8887
code = """spam(a=1, (b := 2))"""
8988

89+
#with self.assertRaisesRegex(SyntaxError,
90+
# "positional argument follows keyword argument"): # TODO RustPython
9091
with self.assertRaises(SyntaxError):
9192
exec(code, {}, {})
9293

93-
# Test modified to accept syntax error with deviating message
9494
def test_named_expression_invalid_14(self):
9595
code = """(x := lambda: y := 1)"""
9696

97+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
9798
with self.assertRaises(SyntaxError):
9899
exec(code, {}, {})
99100

100-
# Test modified to accept syntax error with deviating message
101101
def test_named_expression_invalid_15(self):
102102
code = """(lambda: x := 1)"""
103103

104-
with self.assertRaises(SyntaxError):
104+
#with self.assertRaisesRegex(SyntaxError,
105+
# "cannot use assignment expressions with lambda"): # TODO RustPython
106+
with self.assertRaises(SyntaxError):
105107
exec(code, {}, {})
106108

107-
# Test modified to accept syntax error with deviating message
108109
def test_named_expression_invalid_16(self):
109110
code = "[i + 1 for i in i := [1,2]]"
110111

111-
with self.assertRaises(SyntaxError):
112+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
113+
with self.assertRaises(SyntaxError):
112114
exec(code, {}, {})
113115

114-
# Test modified to accept syntax error with deviating message
115116
def test_named_expression_invalid_17(self):
116117
code = "[i := 0, j := 1 for i, j in [(1, 2), (3, 4)]]"
117118

119+
#with self.assertRaisesRegex(SyntaxError, "invalid syntax"): # TODO RustPython
118120
with self.assertRaises(SyntaxError):
119121
exec(code, {}, {})
120122

@@ -123,11 +125,11 @@ def test_named_expression_invalid_in_class_body(self):
123125
[(42, 1 + ((( j := i )))) for i in range(5)]
124126
"""
125127

126-
with self.assertRaisesRegex(SyntaxError,
127-
"assignment expression within a comprehension cannot be used in a class body"):
128+
#with self.assertRaisesRegex(SyntaxError,
129+
# "assignment expression within a comprehension cannot be used in a class body"): # TODO RustPython
130+
with self.assertRaises(SyntaxError):
128131
exec(code, {}, {})
129-
130-
# Test modified to accept syntax error with deviating message
132+
131133
def test_named_expression_invalid_rebinding_comprehension_iteration_variable(self):
132134
cases = [
133135
("Local reuse", 'i', "[i := 0 for i in range(5)]"),
@@ -140,26 +142,30 @@ def test_named_expression_invalid_rebinding_comprehension_iteration_variable(sel
140142
"[(i, j) for i in range(5) for j in range(5) if True or (i:=10)]"),
141143
]
142144
for case, target, code in cases:
145+
#msg = f"assignment expression cannot rebind comprehension iteration variable '{target}'"
143146
with self.subTest(case=case):
147+
#with self.assertRaisesRegex(SyntaxError, msg): #TODO RustPython
144148
with self.assertRaises(SyntaxError):
145149
exec(code, {}, {})
146150

147-
# Test modified to accept syntax error with deviating message
148151
def test_named_expression_invalid_rebinding_comprehension_inner_loop(self):
149152
cases = [
150153
("Inner reuse", 'j', "[i for i in range(5) if (j := 0) for j in range(5)]"),
151154
("Inner unpacking reuse", 'j', "[i for i in range(5) if (j := 0) for j, k in [(0, 1)]]"),
152155
]
153156
for case, target, code in cases:
157+
#msg = f"comprehension inner loop cannot rebind assignment expression target '{target}'"
154158
with self.subTest(case=case):
159+
#with self.assertRaisesRegex(SyntaxError, msg): # TODO RustPython
155160
with self.assertRaises(SyntaxError):
156161
exec(code, {}) # Module scope
162+
#with self.assertRaisesRegex(SyntaxError, msg): # TODO RustPython
157163
with self.assertRaises(SyntaxError):
158164
exec(code, {}, {}) # Class scope
165+
#with self.assertRaisesRegex(SyntaxError, msg): # TODO RustPython
159166
with self.assertRaises(SyntaxError):
160167
exec(f"lambda: {code}", {}) # Function scope
161168

162-
# Test modified to accept syntax error with deviating message
163169
def test_named_expression_invalid_comprehension_iterable_expression(self):
164170
cases = [
165171
("Top level", "[i for i in (i := range(5))]"),
@@ -172,12 +178,16 @@ def test_named_expression_invalid_comprehension_iterable_expression(self):
172178
("Nested comprehension condition", "[i for i in [j for j in range(5) if (j := True)]]"),
173179
("Nested comprehension body", "[i for i in [(j := True) for j in range(5)]]"),
174180
]
181+
#msg = "assignment expression cannot be used in a comprehension iterable expression"
175182
for case, code in cases:
176183
with self.subTest(case=case):
184+
#with self.assertRaisesRegex(SyntaxError, msg): # TODO RustPython
177185
with self.assertRaises(SyntaxError):
178186
exec(code, {}) # Module scope
187+
#with self.assertRaisesRegex(SyntaxError, msg): # TODO RustPython
179188
with self.assertRaises(SyntaxError):
180189
exec(code, {}, {}) # Class scope
190+
#with self.assertRaisesRegex(SyntaxError, msg): # TODO RustPython
181191
with self.assertRaises(SyntaxError):
182192
exec(f"lambda: {code}", {}) # Function scope
183193

@@ -191,9 +201,9 @@ def test_named_expression_assignment_01(self):
191201

192202
def test_named_expression_assignment_02(self):
193203
a = 20
194-
(a := a+10)
204+
(a := a)
195205

196-
self.assertEqual(a, 30)
206+
self.assertEqual(a, 20)
197207

198208
def test_named_expression_assignment_03(self):
199209
(total := 1 + 2)
@@ -312,20 +322,10 @@ def test_named_expression_scope_03(self):
312322
def test_named_expression_scope_04(self):
313323
def spam(a):
314324
return a
315-
316-
y=1
317325
res = [[y := spam(x), x/y] for x in range(1, 5)]
318326

319327
self.assertEqual(y, 4)
320328

321-
def test_named_expression_scope_04a(self):
322-
def spam(a):
323-
return a
324-
y=1
325-
res = [y := spam(x//y) for x in range(1, 5)]
326-
327-
self.assertEqual(y, 4)
328-
329329
def test_named_expression_scope_05(self):
330330
def spam(a):
331331
return a
@@ -344,7 +344,7 @@ def test_named_expression_scope_06(self):
344344
self.assertEqual(res, [[0, 1, 2], [0, 1, 2]])
345345
self.assertEqual(spam, 2)
346346

347-
# modified version of test_named_expression_scope_10, where locals
347+
# modified version of test_named_expression_scope_6, where locals
348348
# assigned before to make them known in scop. THis is required due
349349
# to some shortcommings in RPs name handling.
350350
def test_named_expression_scope_06_rp_modified(self):
@@ -390,8 +390,8 @@ def test_named_expression_scope_10(self):
390390
res = [b := [a := 1 for i in range(2)] for j in range(2)]
391391

392392
self.assertEqual(res, [[1, 1], [1, 1]])
393-
self.assertEqual(b, [1, 1])
394393
self.assertEqual(a, 1)
394+
self.assertEqual(b, [1, 1])
395395

396396
# modified version of test_named_expression_scope_10, where locals
397397
# assigned before to make them known in scop. THis is required due
@@ -410,7 +410,7 @@ def test_named_expression_scope_11(self):
410410

411411
self.assertEqual(res, [0, 1, 2, 3, 4])
412412
self.assertEqual(j, 4)
413-
413+
414414
def test_named_expression_scope_17(self):
415415
b = 0
416416
res = [b := i + b for i in range(5)]
@@ -566,7 +566,5 @@ def g():
566566
f()
567567

568568

569-
570-
571569
if __name__ == "__main__":
572-
unittest.main()
570+
unittest.main()

compiler/src/symboltable.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,7 @@ impl SymbolTableBuilder {
10111011
}
10121012
SymbolUsage::Iter => {
10131013
symbol.is_iter = true;
1014+
symbol.scope = SymbolScope::Local;
10141015
}
10151016
}
10161017

0 commit comments

Comments
 (0)