26.1.0
Black 2026 Stable Style
Breaking Changes:
.gitignorepatterns now match Git's behavior exactly — files matching a pattern stay ignored even if parent directory is unignored (#4958)- Migration: Use
*/exclude/*+!*/exclude/not_this/pattern to include subdirectories instead of!exclude/not_this/
- Migration: Use
pathspecbumped to v1 (new behavior tied to this upgrade)
Features:
always_one_newline_after_import: Enforce one blank line after imports (except before comments/imports)remove_parens_around_except_types: Strip parens from multi-exceptionexcept/except*withoutasremove_parens_from_assignment_lhs: Remove unnecessary parens from assignment left-hand side while preserving trailing commasstandardize_type_comments: Format type comments to# type: (value)consistentlynormalize_cr_newlines: Normalize\rnewlines alongside\n/\r\n- Regenerated Unicode width table with Khmer language support
Fixes:
fix_fmt_skip_in_one_liners: Prevent incorrect collapse of# fmt: skipon one-liners likedef foo(): return "mock" # fmt: skipfix_module_docstring_detection: Module docstrings preceded by comments no longer misidentified as normal stringsfix_type_expansion_split: Type expansions in generic functions split correctlymultiline_string_handling: Expressions with multiline strings format more compactly
Improvements:
- Multiprocessing manager now explicitly shuts down in diff mode (#4952)
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)