- Fix two crashes in preview style involving edge cases with docstrings (#3451)
- Exclude string type annotations from improved string processing; fix crash when the
return type annotation is stringified and spans across multiple lines (#3462)
+- Fix several crashes in preview style with walrus operators used in `with` statements
+ or tuples (#3473)
### Configuration
is_rpar_token,
is_stub_body,
is_stub_suite,
+ is_tuple_containing_walrus,
is_vararg,
is_walrus_assignment,
is_yield,
not remove_brackets_around_comma
and max_delimiter_priority_in_atom(node) >= COMMA_PRIORITY
)
+ or is_tuple_containing_walrus(node)
):
return False
syms.return_stmt,
syms.except_clause,
syms.funcdef,
+ syms.with_stmt,
# these ones aren't useful to end users, but they do please fuzzers
syms.for_stmt,
syms.del_stmt,
+ syms.for_stmt,
]:
return False
)
+def is_tuple_containing_walrus(node: LN) -> bool:
+ """Return True if `node` holds a tuple that contains a walrus operator."""
+ if node.type != syms.atom:
+ return False
+ gexp = unwrap_singleton_parenthesis(node)
+ if gexp is None or gexp.type != syms.testlist_gexp:
+ return False
+
+ return any(child.type == syms.namedexpr_test for child in gexp.children)
+
+
def is_one_sequence_between(
opening: Leaf,
closing: Leaf,
@(please := stop)
def sigh():
pass
+
+
+for (x := 3, y := 4) in y:
+ pass
def this_is_so_dumb() -> (please := no):
pass
+async def await_the_walrus():
+ with (x := y):
+ pass
+
+ with (x := y) as z, (a := b) as c:
+ pass
+
+ with (x := await y):
+ pass
+
+ with (x := await a, y := await b):
+ pass
+
+ # Ideally we should remove one set of parentheses
+ with ((x := await a, y := await b)):
+ pass
+
+ with (x := await a), (y := await b):
+ pass
+
# output
if foo := 0:
def this_is_so_dumb() -> (please := no):
pass
+
+async def await_the_walrus():
+ with (x := y):
+ pass
+
+ with (x := y) as z, (a := b) as c:
+ pass
+
+ with (x := await y):
+ pass
+
+ with (x := await a, y := await b):
+ pass
+
+ # Ideally we should remove one set of parentheses
+ with ((x := await a, y := await b)):
+ pass
+
+ with (x := await a), (y := await b):
+ pass