Avoid removing whitespace for walrus operators within subscripts (#3823)

Co-authored-by: hauntsaninja <hauntsaninja@gmail.com>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Charlie Marsh 2023-09-08 16:37:13 +02:00 committed by GitHub
parent 74d3009ba4
commit a20338cf10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 37 additions and 2 deletions

View File

@ -80,6 +80,7 @@
(#3740)
- Fix error in AST validation when _Black_ removes trailing whitespace in a type comment
(#3773)
- Fix a bug whereby spaces were removed from walrus operators within subscript (#3823)
### Preview style

View File

@ -81,7 +81,9 @@ def append(
# Note: at this point leaf.prefix should be empty except for
# imports, for which we only preserve newlines.
leaf.prefix += whitespace(
leaf, complex_subscript=self.is_complex_subscript(leaf)
leaf,
complex_subscript=self.is_complex_subscript(leaf),
mode=self.mode,
)
if self.inside_brackets or not preformatted or track_bracket:
self.bracket_tracker.mark(leaf)

View File

@ -183,6 +183,7 @@ class Preview(Enum):
wrap_long_dict_values_in_parens = auto()
wrap_multiple_context_managers_in_parens = auto()
dummy_implementations = auto()
walrus_subscript = auto()
class Deprecated(UserWarning):

View File

@ -13,6 +13,7 @@
from mypy_extensions import mypyc_attr
from black.cache import CACHE_DIR
from black.mode import Mode, Preview
from black.strings import has_triple_quotes
from blib2to3 import pygram
from blib2to3.pgen2 import token
@ -171,7 +172,7 @@ def visit_default(self, node: LN) -> Iterator[T]:
yield from self.visit(child)
def whitespace(leaf: Leaf, *, complex_subscript: bool) -> str: # noqa: C901
def whitespace(leaf: Leaf, *, complex_subscript: bool, mode: Mode) -> str: # noqa: C901
"""Return whitespace prefix if needed for the given `leaf`.
`complex_subscript` signals whether the given leaf is part of a subscription
@ -345,6 +346,11 @@ def whitespace(leaf: Leaf, *, complex_subscript: bool) -> str: # noqa: C901
return NO
elif Preview.walrus_subscript in mode and (
t == token.COLONEQUAL or prev.type == token.COLONEQUAL
):
return SPACE
elif not complex_subscript:
return NO

View File

@ -0,0 +1,6 @@
x[(a:=0):]
x[:(a:=0)]
# output
x[(a := 0):]
x[:(a := 0)]

View File

@ -0,0 +1,12 @@
x[a:=0]
x[a := 0]
x[a := 0, b := 1]
x[5, b := 0]
x[a:=0,b:=1]
# output
x[a := 0]
x[a := 0]
x[a := 0, b := 1]
x[5, b := 0]
x[a := 0, b := 1]

View File

@ -56,6 +56,13 @@ def test_preview_context_managers_targeting_py39() -> None:
assert_format(source, expected, mode, minimum_version=(3, 9))
@pytest.mark.parametrize("filename", all_data_cases("preview_py_310"))
def test_preview_python_310(filename: str) -> None:
source, expected = read_data("preview_py_310", filename)
mode = black.Mode(target_versions={black.TargetVersion.PY310}, preview=True)
assert_format(source, expected, mode, minimum_version=(3, 10))
@pytest.mark.parametrize(
"filename", all_data_cases("preview_context_managers/auto_detect")
)