summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_parser.py')
-rw-r--r--Lib/test/test_parser.py46
1 files changed, 41 insertions, 5 deletions
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py
index 9b58bb9..ac3899b 100644
--- a/Lib/test/test_parser.py
+++ b/Lib/test/test_parser.py
@@ -115,6 +115,7 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase):
self.check_expr("foo * bar")
self.check_expr("foo / bar")
self.check_expr("foo // bar")
+ self.check_expr("(foo := 1)")
self.check_expr("lambda: 0")
self.check_expr("lambda x: 0")
self.check_expr("lambda *y: 0")
@@ -421,6 +422,40 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase):
self.check_expr('{x**2:x[3] for x in seq if condition(x)}')
self.check_expr('{x:x for x in seq1 for y in seq2 if condition(x, y)}')
+ def test_named_expressions(self):
+ self.check_suite("(a := 1)")
+ self.check_suite("(a := a)")
+ self.check_suite("if (match := pattern.search(data)) is None: pass")
+ self.check_suite("[y := f(x), y**2, y**3]")
+ self.check_suite("filtered_data = [y for x in data if (y := f(x)) is None]")
+ self.check_suite("(y := f(x))")
+ self.check_suite("y0 = (y1 := f(x))")
+ self.check_suite("foo(x=(y := f(x)))")
+ self.check_suite("def foo(answer=(p := 42)): pass")
+ self.check_suite("def foo(answer: (p := 42) = 5): pass")
+ self.check_suite("lambda: (x := 1)")
+ self.check_suite("(x := lambda: 1)")
+ self.check_suite("(x := lambda: (y := 1))") # not in PEP
+ self.check_suite("lambda line: (m := re.match(pattern, line)) and m.group(1)")
+ self.check_suite("x = (y := 0)")
+ self.check_suite("(z:=(y:=(x:=0)))")
+ self.check_suite("(info := (name, phone, *rest))")
+ self.check_suite("(x:=1,2)")
+ self.check_suite("(total := total + tax)")
+ self.check_suite("len(lines := f.readlines())")
+ self.check_suite("foo(x := 3, cat='vector')")
+ self.check_suite("foo(cat=(category := 'vector'))")
+ self.check_suite("if any(len(longline := l) >= 100 for l in lines): print(longline)")
+ self.check_suite(
+ "if env_base := os.environ.get('PYTHONUSERBASE', None): return env_base"
+ )
+ self.check_suite(
+ "if self._is_special and (ans := self._check_nans(context=context)): return ans"
+ )
+ self.check_suite("foo(b := 2, a=1)")
+ self.check_suite("foo(b := 2, a=1)")
+ self.check_suite("foo((b := 2), a=1)")
+ self.check_suite("foo(c=(b := 2), a=1)")
#
# Second, we take *invalid* trees and make sure we get ParserError
@@ -694,16 +729,16 @@ class IllegalSyntaxTestCase(unittest.TestCase):
def test_illegal_encoding(self):
# Illegal encoding declaration
tree = \
- (340,
+ (341,
(257, (0, '')))
self.check_bad_tree(tree, "missed encoding")
tree = \
- (340,
+ (341,
(257, (0, '')),
b'iso-8859-1')
self.check_bad_tree(tree, "non-string encoding")
tree = \
- (340,
+ (341,
(257, (0, '')),
'\udcff')
with self.assertRaises(UnicodeEncodeError):
@@ -776,8 +811,9 @@ class ParserStackLimitTestCase(unittest.TestCase):
return "["*level+"]"*level
def test_deeply_nested_list(self):
- # XXX used to be 99 levels in 2.x
- e = self._nested_expression(93)
+ # This has fluctuated between 99 levels in 2.x, down to 93 levels in
+ # 3.7.X and back up to 99 in 3.8.X. Related to MAXSTACK size in Parser.h
+ e = self._nested_expression(99)
st = parser.expr(e)
st.compile()