- Introduce the 2026 stable style with always_one_newline_after_import to force one blank line after import statements except when followed by a comment or import
- Add multiline_string_handling to make expressions involving multiline strings more compact
- Add normalize_cr_newlines to normalize file newlines with \r style newlines
- Add remove_parens_around_except_types to remove parentheses around multiple exception types in except and except* without as
- Add remove_parens_from_assignment_lhs to remove unnecessary parentheses from the left-hand side of assignments while preserving magic trailing commas
- Add standardize_type_comments to format type comments to # type: (value) style
- Regenerate the _width_table.py with added tests for the Khmer language
- Bump pathspec to v1 and fix inconsistencies with Git's .gitignore logic to match Git behavior for ignored patterns
- Fix fmt: skip behavior on one-liner declarations to prevent incorrect collapsing
- Fix module docstrings being treated as normal strings if preceded by comments
- Fix type expansions split in generic functions
- Explicitly shutdown the multiprocessing manager when run in diff mode
Highlights
Introduces the 2026 stable style (#4892), stabilizing the following changes:
always_one_newline_after_import: Always force one blank line after import statements, except when the line after the import is a comment or an import statement (#4489)fix_fmt_skip_in_one_liners: Fix# fmt: skipbehavior on one-liner declarations, such asdef foo(): return "mock" # fmt: skip, where previously the declaration would have been incorrectly collapsed (#4800)fix_module_docstring_detection: Fix module docstrings being treated as normal strings if preceded by comments (#4764)fix_type_expansion_split: Fix type expansions split in generic functions (#4777)multiline_string_handling: Make expressions involving multiline strings more compact (#1879)normalize_cr_newlines: Add\rstyle newlines to the potential newlines to normalize file newlines both from and to (#4710)remove_parens_around_except_types: Remove parentheses around multiple exception types inexceptandexcept*withoutas(#4720)remove_parens_from_assignment_lhs: Remove unnecessary parentheses from the left-hand side of assignments while preserving magic trailing commas and intentional multiline formatting (#4865)standardize_type_comments: Format type comments which have zero or more spaces between#andtype:or betweentype:and value to# type: (value)(#4645)
The following change was not in any previous stable release:
- Regenerated the
_width_table.pyand added tests for the Khmer language (#4253)
This release alo bumps pathspec to v1 and fixes inconsistencies with Git's
.gitignore logic (#4958). Now, files will be ignored if a pattern matches them, even
if the parent directory is directly unignored. For example, Black would previously
format exclude/not_this/foo.py with this .gitignore:
exclude/
!exclude/not_this/
Now, exclude/not_this/foo.py will remain ignored. To ensure exclude/not_this/ and
all of it's children are included in formatting (and in Git), use this .gitignore:
*/exclude/*
!*/exclude/not_this/
This new behavior matches Git. The leading */ are only necessary if you wish to ignore
matching subdirectories (like the previous behavior did), and not just matching root
directories.
Output
- Explicitly shutdown the multiprocessing manager when run in diff mode too (#4952)
Integrations
- Upgraded PyPI upload workflow to use Trusted Publishing (#4611)