gh-96497: Mangle name before symtable lookup in 'symtable_extend_namedexpr_scope' (GH-96561)

This commit is contained in:
wookie184 2024-02-17 12:06:31 +00:00 committed by GitHub
parent e88ebc1c40
commit 664965a1c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 34 additions and 4 deletions

View file

@ -298,6 +298,16 @@ class NamedExpressionInvalidTest(unittest.TestCase):
with self.assertRaisesRegex(SyntaxError, msg):
exec(f"lambda: {code}", {}) # Function scope
def test_named_expression_invalid_mangled_class_variables(self):
code = """class Foo:
def bar(self):
[[(__x:=2) for _ in range(2)] for __x in range(2)]
"""
with self.assertRaisesRegex(SyntaxError,
"assignment expression cannot rebind comprehension iteration variable '__x'"):
exec(code, {}, {})
class NamedExpressionAssignmentTest(unittest.TestCase):
@ -674,6 +684,18 @@ spam()"""
for idx, elem in enumerate(genexp):
self.assertEqual(elem, b[idx] + a)
def test_named_expression_scope_mangled_names(self):
class Foo:
def f(self_):
global __x1
__x1 = 0
[_Foo__x1 := 1 for a in [2]]
self.assertEqual(__x1, 1)
[__x1 := 2 for a in [3]]
self.assertEqual(__x1, 2)
Foo().f()
self.assertEqual(_Foo__x1, 2)
if __name__ == "__main__":
unittest.main()