Skip to content

Simplify power operator hugging implementation#4918

Merged
cobaltt7 merged 3 commits intopsf:mainfrom
adamsol:simplify-power-operator-hugging
Jan 23, 2026
Merged

Simplify power operator hugging implementation#4918
cobaltt7 merged 3 commits intopsf:mainfrom
adamsol:simplify-power-operator-hugging

Conversation

@adamsol
Copy link
Copy Markdown
Contributor

@adamsol adamsol commented Dec 25, 2025

Description

This PR replaces the current power operator hugging implementation, which uses transformers and is quite complicated, with a simpler one, implemented directly in the whitespace function.

The original implementation was created in #2726 and later fixed in #2806, #2874, #3942, #4154. Currently it takes around 150 lines of code, while the new implementation takes around 30 lines.

A minor side-effect of the change is that the whitespace is removed also if the power operator is moved to a separate line, so we'll have 1<newline>**1 instead of 1<newline>** 1. But this shouldn't occur in any normal code and wasn't even tested in the original PR.

Here's how this commit would look like (all deleted lines etc.) without preview mode: adamsol@2444f5c

The main rationale for this refactoring was to extract the condition for power operator hugging into one function, so that the logic could be shared with another change that I want to upload later (edit: #4925). While making it, I also found a small bug related to the power operator (in the visit_factor function), for which I'm planning to submit a separate PR.

Let me know if there could be some specific reason the original implementation did not use the whitespace function, or if I'm missing anything else (this is my first commit here).

Checklist - did you ...

  • Implement any code style changes under the --preview style, following the
    stability policy?
  • Add an entry in CHANGES.md if necessary?
  • Add / update tests if necessary?
  • Add new / update outdated documentation?

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Dec 26, 2025

diff-shades results comparing this PR (6ed4032) to main (a998a18):

--preview style: no changes

--stable style: no changes


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

@cobaltt7
Copy link
Copy Markdown
Collaborator

cobaltt7 commented Jan 1, 2026

This change looks like an improvement to me, thanks! Will merge after the 2026 style is stabilized, because we want to reduce noise in that release.

Signed-off-by: cobalt <61329810+cobaltt7@users.noreply.github.com>
@cobaltt7 cobaltt7 merged commit 1d233bb into psf:main Jan 23, 2026
56 checks passed
@adamsol adamsol deleted the simplify-power-operator-hugging branch January 23, 2026 18:18
cobaltt7 added a commit to cobaltt7/black that referenced this pull request Feb 21, 2026
Co-authored-by: cobalt <61329810+cobaltt7@users.noreply.github.com>
luketainton pushed a commit to luketainton/repos_webexmemebot that referenced this pull request Mar 6, 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.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

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

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/webexmemebot/pulls/571
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_pypilot that referenced this pull request Mar 6, 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.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

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

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/pypilot/pulls/421
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/luke_instant-msg-api that referenced this pull request Mar 6, 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.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

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

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/luke/instant-msg-api/pulls/246
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_epage that referenced this pull request Mar 6, 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.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

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

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/epage/pulls/208
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_PwnedPW that referenced this pull request Mar 6, 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.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

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

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsibGludGluZyJdfQ==-->

Reviewed-on: https://git.tainton.uk/repos/PwnedPW/pulls/326
Reviewed-by: Luke Tainton <luke@tainton.uk>
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-by: renovate[bot] <renovate-bot@git.tainton.uk>
luketainton pushed a commit to luketainton/repos_roboluke that referenced this pull request Mar 6, 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.1.1,>=26.1.0` → `<26.3.1,>=26.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/black/26.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/black/26.1.0/26.3.0?slim=true) |

---

### Release Notes

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

### [`v26.3.0`](https://github.com/psf/black/blob/HEAD/CHANGES.md#2630)

[Compare Source](psf/black@26.1.0...26.3.0)

##### Stable style

- Don't double-decode input, causing non-UTF-8 files to be corrupted ([#&#8203;4964](psf/black#4964))
- Fix crash on standalone comment in lambda default arguments ([#&#8203;4993](psf/black#4993))
- Preserve parentheses when `# type: ignore` comments would be merged with other
  comments on the same line, preventing AST equivalence failures ([#&#8203;4888](psf/black#4888))

##### Preview style

- Fix bug where `if` guards in `case` blocks were incorrectly split when the pattern had
  a trailing comma ([#&#8203;4884](psf/black#4884))
- Fix `string_processing` crashing on unassigned long string literals with trailing
  commas (one-item tuples) ([#&#8203;4929](psf/black#4929))
- Simplify implementation of the power operator "hugging" logic ([#&#8203;4918](psf/black#4918))

##### Packaging

- Fix shutdown errors in PyInstaller builds on macOS by disabling multiprocessing in
  frozen environments ([#&#8203;4930](psf/black#4930))

##### Performance

- Introduce winloop for windows as an alternative to uvloop ([#&#8203;4996](psf/black#4996))
- Remove deprecated function `uvloop.install()` in favor of `uvloop.new_event_loop()`
  ([#&#8203;4996](psf/black#4996))
- Rename `maybe_install_uvloop` function to `maybe_use_uvloop` to simplify loop
  installation and creation of either a uvloop/winloop evenloop or default eventloop
  ([#&#8203;4996](psf/black#4996))

##### Output

- Emit a clear warning when the target Python version is newer than the running Python
  version, since AST safety checks cannot parse newer syntax. Also replace the
  misleading "INTERNAL ERROR" message with an actionable error explaining the version
  mismatch ([#&#8203;4983](psf/black#4983))

##### *Blackd*

- Introduce winloop to be used when windows in use which enables blackd to run faster on
  windows when winloop is installed. ([#&#8203;4996](psf/black#4996))

##### Integrations

- Remove unused gallery script ([#&#8203;5030](psf/black#5030))
- Harden parsing of `black` requirements in the GitHub Action when `use_pyproject` is
  enabled so that only version specifiers are accepted and direct references such as
  `black @&#8203; https://...` are rejected. Users should upgrade to the latest version of the
  action as soon as possible. This update is received automatically when using
  `psf/black@stable`, and is independent of the version of Black installed by the
  action. ([#&#8203;5031](psf/black#5031))

##### Documentation

- Expand preview style documentation with detailed examples for `wrap_comprehension_in`,
  `simplify_power_operator_hugging`, and `wrap_long_dict_values_in_parens` features
  ([#&#8203;4987](psf/black#4987))
- Add detailed documentation for formatting Jupyter Notebooks ([#&#8203;5009](psf/black#5009))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OC4wIiwidXBkYXRlZEluVmVyIjoiNDMuNTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsidHlwZS9kZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.tainton.uk/repos/roboluke/pulls/431
Co-authored-by: renovate[bot] <renovate-bot@git.tainton.uk>
Co-committed-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

Development

Successfully merging this pull request may close these issues.

2 participants