# Black 26.1.0 - Product: Black (https://whatsnew.fyi/product/black) - Vendor: Python Software Foundation - Date: 2026-01-18 - Version: 26.1.0 - Original notes: https://github.com/psf/black/releases/tag/26.1.0 - Permalink: https://whatsnew.fyi/product/black/releases/26.1.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — 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 - **fixed** — Fix fmt: skip behavior on one-liner declarations to prevent incorrect collapsing - **fixed** — Fix module docstrings being treated as normal strings if preceded by comments - **fixed** — Fix type expansions split in generic functions - **added** — Add multiline_string_handling to make expressions involving multiline strings more compact - **added** — Add normalize_cr_newlines to normalize file newlines with \r style newlines - **added** — Add remove_parens_around_except_types to remove parentheses around multiple exception types in except and except* without as - **added** — Add remove_parens_from_assignment_lhs to remove unnecessary parentheses from the left-hand side of assignments while preserving magic trailing commas - **added** — Add standardize_type_comments to format type comments to # type: (value) style - **changed** — Regenerate the _width_table.py with added tests for the Khmer language - **changed** — Bump pathspec to v1 and fix inconsistencies with Git's .gitignore logic to match Git behavior for ignored patterns - **fixed** — 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: skip` behavior on one-liner declarations, such as `def 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 `\r` style 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 in `except` and `except*` without `as` (#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 `#` and `type:` or between `type:` and value to `# type: (value)` (#4645) The following change was not in any previous stable release: - Regenerated the `_width_table.py` and 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)