Skip to content

Fix unnecessary line breaks for expressions with comments under preview (#4026, #3713) - #5455

Merged
cobaltt7 merged 3 commits into
psf:mainfrom
Prateek99-s:fix-commented-binary-op-linebreak-4026
Oct 5, 2026
Merged

cobaltt7 merged 3 commits into
psf:mainfrom
Prateek99-s:fix-commented-binary-op-linebreak-4026

Conversation

@Prateek99-s

@Prateek99-s Prateek99-s commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Fixes #4026
Fixes #3713

Problem

When a bracketed construct (such as a list literal or function call) contains a standalone comment
before a short expression with operators (binary math, comparisons, comprehensions, etc.), Black
unnecessarily breaks the expression across multiple lines even when it easily fits well within
--line-length:

# Before
foobar = [
    # comment
    pathlib.Path("foo")
    / "bar"
    / "baz",
]

fizzbuzz = [
    # comment
    23
    / 7
]

func(
    # comment
    a
    * b
)

Solution

Avoid splitting on delimiters when a preceding standalone comment pushed the line onto its own line
and the expression comfortably fits on a single line.

# After (with --preview)
foobar = [
    # comment
    pathlib.Path("foo") / "bar" / "baz",
]

fizzbuzz = [
    # comment
    23 / 7
]

func(
    # comment
    a * b
)

Test Plan

  • Added regression tests in tests/data/cases/.
  • Ran full test suite and pre-commit checks.

Prateek99-s added a commit to Prateek99-s/black that referenced this pull request Sep 29, 2026
@github-actions

github-actions Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

diff-shades results comparing this PR (bd80859) to main (e74a324):

--preview style (View full diff):
╭─────────────────────── Summary ────────────────────────╮
│ 9 projects & 45 files changed / 278 changes [+94/-184] │
│                                                        │
│ ... out of 3 108 161 lines, 14 187 files & 22 projects │
╰────────────────────────────────────────────────────────╯

Differences found.

--stable style: no changes


What is this? | Workflow run | diff-shades documentation

@cobaltt7

cobaltt7 commented Oct 3, 2026 •

Copy link
Copy Markdown
Collaborator

Your PR descriptions are often oddly formatted, with unnecessary indentation and line breaks. In this case, it causes the "Fixes" statements not to be picked up, and the example seems to cut off early. Please fix this PR's description as well as paying attention to these issues for any future PRs. Thanks

Comment thread src/black/linegen.py Resolved
@Prateek99-s
Prateek99-s force-pushed the fix-commented-binary-op-linebreak-4026 branch from 41f79cc to 86212dd Compare October 4, 2026 17:14
@Prateek99-s
Prateek99-s force-pushed the fix-commented-binary-op-linebreak-4026 branch from 86212dd to f8485e6 Compare October 4, 2026 17:31
@Prateek99-s

Copy link
Copy Markdown
Contributor Author

Thanks for the review!

- Fixed the PR description formatting and links.                                         
- Expanded the fix to cover all delimiters(like comprehensions and `==`) and added tests.
- Renamed the feature to `keep_commented_expressions_together`.         
- Rebased on latest main, and all CI checks are green now.  

@cobaltt7

cobaltt7 commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator

Thanks!

@cobaltt7
cobaltt7 merged commit d9d091d into psf:main Oct 5, 2026
58 checks passed
luketainton pushed a commit to luketainton/luke_instant-msg-api that referenced this pull request Oct 10, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [black](https://github.com/psf/black) ([changelog](https://github.com/psf/black/blob/main/CHANGES.md)) | `<26.10.1,>=26.10.0` → `<26.10.2,>=26.10.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.10.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.10.0/26.10.1?slim=true) |

---

### Release Notes

<details>
<summary>psf/black (black)</summary>

### [`v26.10.1`](https://github.com/psf/black/blob/HEAD/CHANGES.md#Version-26101)

[Compare Source](psf/black@26.10.0...26.10.1)

##### Highlights

This release fixes a security issue in Black's bundled GitHub Action. Repositories that
use the action are encouraged to update to the latest version of Black immediately. This
update is received automatically when using `psf/black@stable`, and is independent of
the version of Black installed by the action.

When the GitHub Action reads version specifiers from `tool.black.required-version`, it
now only accepts released versions of Black, as it already did for `black` requirements
in dependency lists. Other values, such as URL references, are now rejected. This issue
has been registered as `GHSA-cg8m-r9f2-5wm2`; a CVE identifier is pending.

##### Stable style

- Fix a long Jupyter notebook assignment magic (for example `x = !ls -la`) being wrapped
  in parentheses, which IPython can no longer run; such cells are now left unchanged
  ([#&#8203;5481](psf/black#5481))
- Keep repeated lines outside the selected `--line-ranges` unchanged ([#&#8203;5436](psf/black#5436))
- Fix `--line-ranges` formatting lines that follow a statement when formatting joins or
  re-indents that statement ([#&#8203;5484](psf/black#5484))
- Fix `--line-ranges` crashing with an internal error when an unselected statement has a
  `# fmt: skip` comment on the last line before a closing bracket ([#&#8203;5477](psf/black#5477))
- Prevent moving an encoding declaration (for example `# -*- coding: latin-1 -*-`) onto
  the first two lines of a file ([#&#8203;5487](psf/black#5487))
- Fix adding an extra trailing blank line inside a multi-line module docstring when its
  last line is near the line length limit ([#&#8203;5494](psf/black#5494))

##### Preview style

- Do not split short expressions on delimiters (such as binary operators, comparisons,
  or comprehensions) inside brackets when preceded by a standalone comment ([#&#8203;5455](psf/black#5455))
- Fix the unstable `string_processing` feature removing backslash-newline sequences from
  raw strings, which changed their value ([#&#8203;5482](psf/black#5482))
- Avoid adding unnecessary parentheses around unbreakable right-hand side expressions in
  assignments (such as annotated assignments or subscript targets) ([#&#8203;5473](psf/black#5473))
- Parenthesize expressions with parameter comments when they exceed the line length
  under `--preview` ([#&#8203;5442](psf/black#5442))
- Fix `wrap_long_dict_values_in_parens` dropping the parentheses around a right-hand
  side that contains a dictionary, leaving a line over the length limit ([#&#8203;5492](psf/black#5492))
- Fix the unstable `string_processing` feature adding a space after `*` or `**` in a PEP
  695 type parameter (`* Ts = ...`) when it splits a string in the parameter's default
  ([#&#8203;5504](psf/black#5504))
- Avoid unnecessary line splits of trailers (such as indexing/subscripts) when an
  earlier bracket split exceeds the line length only due to a trailing comment ([#&#8203;5498](psf/black#5498))

##### Configuration

- Add `--cache-dir` to configure the cache directory from the command line ([#&#8203;5433](psf/black#5433))
- Don't cache a file as formatted after formatting or checking it with `--line-ranges`,
  which made a later full `black --check` pass and `black` skip the unformatted lines
  ([#&#8203;5476](psf/black#5476))
- Respect a `.gitignore` that starts with a UTF-8 byte order mark. The mark became part
  of the first pattern, so that pattern never matched and Black formatted files that git
  ignores ([#&#8203;5497](psf/black#5497))

##### Performance

- Avoid quadratic runtime when splitting very long lines with many trailing bracket
  pairs (such as consecutive subscripts) ([#&#8203;5475](psf/black#5475))

##### Integrations

- Fix the GitHub Action crashing on dependency-group includes when `use_pyproject` is
  enabled ([#&#8203;5479](psf/black#5479))
- When the GitHub Action reads version specifiers from `tool.black.required-version`, it
  now only accepts released versions of Black, as it already did for `black`
  requirements in dependency lists. Other values, such as URL references, are now
  rejected. ([#&#8203;5510](psf/black#5510))

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNDkuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE0OS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL2RlcGVuZGVuY2llcyJdfQ==-->

Reviewed-on: https://git.tainton.uk/luke/instant-msg-api/pulls/292
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants