You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
--line-ranges no longer inserts an empty line after a docstring when the range
covers only the docstring itself (#5312)
Fix # fmt: skip on a bracketed ternary turning the surrounding tuple into a call
(#5464)
Fix crash when # fmt: skip is placed on a one-line function or class with PEP 695
type parameters (#5429)
Fix an inline comment after the closing bracket of optional parentheses being moved
inside the parentheses when the parenthesized expression contains own-line comments
(#5395)
Fix unparseable output when # fmt: skip is placed on a bracket of an if, while, for, or with header (#5401, #5405)
Fix crash when formatting parenthesized expressions with multiple inline comments and # fmt: skip (#5414)
Fix parsing Jupyter notebook assignment magics when non-ASCII characters appear
earlier on the line (#5381)
Preserve blank lines that come immediately before a # fmt: on comment (#5300)
Keep the parentheses around the target of an annotated assignment (e.g. (x): int = 5), which prevent CPython from including the name in __annotations__
(#5321)
Stop treating a t-string in docstring position as a docstring (e.g. t" spam " as
the first statement of a module, class or function) (#5287)
Fix unparseable output for a t-string whose replacement field contains a quote (e.g. t'\'{a["b"]}\'') (#5265)
Fix unparseable output for a triple-quoted string whose body ends in an
already-escaped double quote (e.g. '''\'''\"''') (#5262)
Fix --skip-magic-trailing-comma dropping the trailing comma from a split
single-element tuple used as a lambda parameter default (#5246)
Fix unstable formatting when an inline comment sits on optional parentheses (e.g. a
parenthesized assert message) (#5241)
Fix --skip-magic-trailing-comma dropping the trailing comma of a one-element
subscript (a[x,]) when the line is long enough to be split and contains a power
operator (#5272)
Fix crash when a standalone comment sits between tokens of a comprehension or lambda
(#5144)
Fix inline comments on a bracket inside a comprehension being dropped (#5330)
Respect the magic trailing comma in a PEP 695 type parameter list containing a *TypeVarTuple or **ParamSpec (#5244)
Fix crash when a comment-only # fmt: off/# fmt: on block is followed by a with
statement after another standalone comment (#5189)
Fix a crash when splitting case case if ... match patterns at very small line
lengths (#5147)
Fix multiline docstring indentation when leading tabs are used inside indented
docstrings (#5148)
Respect # fmt: skip on a line that opens a bracket (e.g. from x import ( # fmt: skip) when a standalone comment is among the bracket's
contents (#5161)
Fix an AST safety error when separate # type: ignore comments in a parenthesized
attribute chain were merged onto one physical line (#5297)
Preserve comments and blank lines outside requested ranges when formatting with --line-ranges (#5175)
Fix crash when # fmt: skip is used on one-line async def, async with, and async for statements containing a semicolon (#5311)
Stop converting form feeds or other similar characters in docstrings into newlines
(#5461)
Fix --skip-source-first-line turning the skipped line's CRLF ending into \r\r\n
when reformatting a file with CRLF line endings (#5438)
Preview style
New preview features
Add missing blank lines after classes whose last method has an ellipsis body (#5439)
Split only the brackets holding a magic trailing comma when more trailers follow them
(e.g. stop splitting inside the [2] of [1,][2](3)) (#5448)
Keep dictionary keys containing operators together on one line when the value can be
wrapped onto a new line instead (#5435)
Remove redundant parentheses around individual variables in unpacking targets (e.g. for (x), (y) in points: becomes for x, y in points:) (#5416)
Normalize uppercase T prefixes on t-strings to lowercase (#5425)
Remove redundant parentheses around generator expressions (#5304, #5369)
Preserve two blank lines before a top-level class starting inside a # fmt: off block
after an import (#5238)
Fix unnecessary parentheses around short right-hand expressions in indexed assignments
(e.g. x[key] = expr) (#5095)
Parenthesize tuple expressions in yield statements for consistency with function
calls and returns (#5170)
Stop splitting between a variable and its operator (not in, ==, is, ...) when
the right-hand side is a bracketed expression, and instead split inside the brackets
(#5135)
In .pyi stub files, enforce a blank line after a function or method that has a
docstring-only body when another comment or statement follows it (#5158)
Updates to existing preview features
Fix crash in stub files when # fmt: skip is placed on a function in a group of
same-name decorated functions (e.g. @overloads or a property setter) (#5430)
Keep the parentheses around a lambda used as the iterable of a comprehension (e.g. [x for x in (lambda: 0) if x]) (#5176, #5200)
Updates to existing unstable features
Do not treat multi-line expressions with merged strings and trailing # type: ignore
comments as single-line unsplittable expressions (#5466)
Fix duplicated inline comment when stripping the parentheses around a string or
merging a backslash-continued string on the same line (#5449)
Split long stringified return annotations even when the function has parameters
(#5427)
Don't hug brackets when doing so would join two # type: ignore comments onto one
line (#5271)
Fix a crash when # type: ignore is lost during formatting of a long parenthesized
string (#5329)
Fix only the first part of an implicitly concatenated unmergeable string (e.g. r"..." r"...") being wrapped in parentheses (#5434)
Configuration
Add support for NO_COLOR environment variable to disable ANSI output (#5129)
Remove spurious target version warning when runtime version is included in a --target-version flag (#5167)
Fix --force-exclude not excluding files whose path contains .. (e.g. black ../generated/file.py run from a subdirectory) (#5471)
Fall back to the default configuration, with a warning, when the given sources share
no common project root (e.g. they are on different drives on Windows) instead of
crashing (#5386)
Fix loading a stale cached pyproject.toml path when --code is used from different
working directories in the same process (#5152)
Fix superlinear runtime growth with the number of input files (#5450)
Improve performance on strings containing many consecutive backslashes (#5163)
Improve performance on files with many # fmt: skip/# fmt: off/# fmt: on comments
(#5169, #5190, #5232)
Improve performance on long calls and collections (#5177)
Improve performance on multiline strings inside large collections (e.g. a dict literal
with triple-quoted strings as values) (#5188)
Improve performance on files with many soft keywords (e.g. match/case blocks)
(#5186)
Improve performance on long semicolon-separated statements (in the stable style) and
large dict literals (in --preview) (#5184)
Improve performance of --line-ranges on files with many sibling blocks (a long if/elif chain, a match with many cases, or many top-level definitions) (#5213)
Improve performance on deeply nested bracketed expressions (#5171, #5242)
Improve performance on lists and subscripts holding one long expression without
operators (e.g. a long run of implicitly concatenated strings inside []) (#5239)
Improve performance on deeply chained operations (e.g. a long a ** b ** c ** ...
chain) (#5235)
Improve performance on long if/elif chains and other compound statements with many
clauses (#5322)
Improve performance of string_processing:
when merging implicitly concatenated f-strings containing long string literals
(#5165)
when merging long implicitly concatenated strings (#5173, #5194)
when rewriting large nodes (e.g. "%s ..." % (a, b, c, ...)) (#5178, #5199, #5220)
Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>
Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer TIP This summary will be updated as you push new changes.
❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
26.5.1→26.10.0Release Notes
psf/black (black)
v26.10.0Compare Source
Stable style
--line-rangesno longer inserts an empty line after a docstring when the rangecovers only the docstring itself (#5312)
# fmt: skipon a bracketed ternary turning the surrounding tuple into a call(#5464)
# fmt: skipis placed on a one-line function or class with PEP 695type parameters (#5429)
inside the parentheses when the parenthesized expression contains own-line comments
(#5395)
# fmt: skipis placed on a bracket of anif,while,for, orwithheader (#5401, #5405)# fmt: skip(#5414)earlier on the line (#5381)
# fmt: oncomment (#5300)(x): int = 5), which prevent CPython from including the name in__annotations__(#5321)
t" spam "asthe first statement of a module, class or function) (#5287)
t'\'{a["b"]}\'') (#5265)already-escaped double quote (e.g.
'''\'''\"''') (#5262)--skip-magic-trailing-commadropping the trailing comma from a splitsingle-element tuple used as a lambda parameter default (#5246)
parenthesized assert message) (#5241)
--skip-magic-trailing-commadropping the trailing comma of a one-elementsubscript (
a[x,]) when the line is long enough to be split and contains a poweroperator (#5272)
(#5144)
*TypeVarTupleor**ParamSpec(#5244)# fmt: off/# fmt: onblock is followed by awithstatement after another standalone comment (#5189)
case case if ...match patterns at very small linelengths (#5147)
docstrings (#5148)
# fmt: skipon a line that opens a bracket (e.g.from x import ( # fmt: skip) when a standalone comment is among the bracket'scontents (#5161)
# type: ignorecomments in a parenthesizedattribute chain were merged onto one physical line (#5297)
--line-ranges(#5175)# fmt: skipis used on one-lineasync def,async with, andasync forstatements containing a semicolon (#5311)(#5461)
--skip-source-first-lineturning the skipped line's CRLF ending into\r\r\nwhen reformatting a file with CRLF line endings (#5438)
Preview style
New preview features
(e.g. stop splitting inside the
[2]of[1,][2](3)) (#5448)wrapped onto a new line instead (#5435)
for (x), (y) in points:becomesfor x, y in points:) (#5416)Tprefixes on t-strings to lowercase (#5425)# fmt: offblockafter an import (#5238)
(e.g.
x[key] = expr) (#5095)yieldstatements for consistency with functioncalls and returns (#5170)
not in,==,is, ...) whenthe right-hand side is a bracketed expression, and instead split inside the brackets
(#5135)
.pyistub files, enforce a blank line after a function or method that has adocstring-only body when another comment or statement follows it (#5158)
Updates to existing preview features
# fmt: skipis placed on a function in a group ofsame-name decorated functions (e.g.
@overloads or a property setter) (#5430)[x for x in (lambda: 0) if x]) (#5176, #5200)Updates to existing unstable features
# type: ignorecomments as single-line unsplittable expressions (#5466)
merging a backslash-continued string on the same line (#5449)
(#5427)
# type: ignorecomments onto oneline (#5271)
# type: ignoreis lost during formatting of a long parenthesizedstring (#5329)
r"..." r"...") being wrapped in parentheses (#5434)Configuration
NO_COLORenvironment variable to disable ANSI output (#5129)--target-versionflag (#5167)--force-excludenot excluding files whose path contains..(e.g.black ../generated/file.pyrun from a subdirectory) (#5471)no common project root (e.g. they are on different drives on Windows) instead of
crashing (#5386)
pyproject.tomlpath when--codeis used from differentworking directories in the same process (#5152)
--line-rangesvalues (#5107)EOFError(#5192)includeandforce-excludevalues inpyproject.toml(#5193)BLACK_NUM_WORKERSvalues and report invalid values as usage errors insteadof crashing (#5211)
Packaging
PyInstaller release build (#5223)
Immutable Releases
(#5296)
Performance
# fmt: skip/# fmt: off/# fmt: oncomments(#5169, #5190, #5232)
with triple-quoted strings as values) (#5188)
match/caseblocks)(#5186)
large dict literals (in
--preview) (#5184)--line-rangeson files with many sibling blocks (a longif/elifchain, amatchwith many cases, or many top-level definitions) (#5213)operators (e.g. a long run of implicitly concatenated strings inside
[]) (#5239)a ** b ** c ** ...chain) (#5235)
if/elifchains and other compound statements with manyclauses (#5322)
string_processing:(#5165)
"%s ..." % (a, b, c, ...)) (#5178, #5199, #5220)Output
path:line:columnlocations (#5237)sys.stdoutthat has nobufferattribute (e.g. in Jupyter notebooks) (#5411)
Blackd
X-Python-Variantheader is empty or has anempty entry (e.g. a trailing comma) (#5428)
pyiin theX-Python-Variantheader (#5441)Integrations
migrate-blackscript (#5319)tool.black.required-versionfor the GitHubAction (#5399)
is_formatted,change_count,same_count,failure_count) to GitHubAction runs (#5408)
Documentation
vim-python-pep8-indent, which provides anindentexprfor Black-styleinsert-mode indentation (#5288)
Configuration
📅 Schedule: (UTC)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.