# fmt: off and # fmt: on (#3439)# fmt: skip applied or there is a standalone comment between decorators (#3470)0.971 to 0.991 so mypycified Black can be built on armv7 (#3380)tomli requirement on 3.11 alpha releases, working around a bug that would cause the requirement not to be installed on any non-final Python releases (#3448)pyproject.toml configuration variables (#3392)latest_prerelease tag automation to follow latest black alpha release on docker images (#3465)vim-plug installation instructions to offer more explicit options (#3468).gitignore rules by considering the .gitignore location and the relative path to the target file (#3338).gitignore presence when more than one source directory is specified (#3336)any(match := my_re.match(text) for text in texts)) (#3327).let g:black_use_virtualenv = 0(#3309)# fmt: on is used on a different block level than # fmt: off (#3281).ipynb_checkpoints directories are now excluded by default (#3293)--skip-source-first-line / -x option to ignore the first line of source code while formatting (#3299)g:black_preview) to enable/disable the preview style (#3246)jupyter option (#3282)<23) for Black version (#3265)# fmt: on/off in the middle of an expression or code block (#3158)# fmt: skip on colon (:) lines (#3148)--skip-string-normalization / -S now prevents docstring prefixes from being normalized as expected (#3168)--skip-magic-trailing-comma or -C, trailing commas are stripped from subscript expressions with more than 1 element (#3209)blackd now supports enabling the preview style via the X-Preview header (#3217)--stdin-filename (#3216).gitignore files in source directories given on the command line are now also respected, previously only .gitignore files in the project root and automatically discovered directories were respected (#3237)Black: so it's clear they come from Black (#3194)asyncio.get_event_loop() to create our event loop which removes DeprecationWarning (#3164)blib2to3 library since it regularly emits error logs about failed caching that can and should be ignored (#3193)#fmt: skip and # fmt:skip comments (notice the lack of spaces) (#2970)with statements (#2926)scripts/migrate-black.py script to ease introduction of Black to a Git project (#3038)--version flag (#2997)tomli instead of tomllib on Python 3.11 builds where tomllib is not available (#2987)except *ExceptionGroup:) is now supported (#3016)Array[Batch, *Shape] or def fn(*args: *T) -> None) is now supported (#3071)strtobool function. It didn't parse true/on/false/off. (#3025)#%% are now standardised to # %% (#2919)except statements (#2939)for loops (#2945)__pypackages__ directories by default (#2836)--required-version (#2832).tomllib instead of tomli (#2903)black-primer, the deprecated internal devtool, has been removed and copied to a separate repository (#2924)for and async for statements, e.g for item in *items_1, *items_2: pass (#2879).At long last, Black is no longer a beta product! This is the first non-beta release and the first release covered by our new stability policy.
--preview flag (#2752)--experimental-string-processing and move the functionality under --preview (#2789)if statements (#2820)case {"key": 1 | 2 as password} (#2686)case 1 as a, 2 as b (#2716)case Foo(bar=baz as quux) (#2749)return and yield constructs now implies 3.8+ (#2700)values: Tuple[int, ...] = 1, 2, 3) now implies 3.8+ (#2708)match() or case() when there is a trailing newline or a comment inside of the parentheses. (#2760)from __future__ import annotations statement now implies Python 3.7+ (#2690)--target-version is set to 3.10 and higher). (#2728)python-cell-magics) to format cells with custom magics in Jupyter Notebooks (#2744)BLACK_CACHE_DIR (#2739).--target-version=py310. (#2758)SRC or --code mandatory and mutually exclusive (#2804)typing-extensions is no longer a required dependency in Python 3.10+ (#2772)click lower bound to 8.0.0 (#2791)https:// (#2761)black-primer tool (#2809)%%writefile. (#2630)--target-version py310 if we detect 3.10-only syntax (#2668)match statements with open sequence subjects, like match a, b: or match a, *b: (#2639) (#2659)match/case statements that contain match/case soft keywords multiple times, like match re.match() (#2661)case statements with an inline body (#2665)match subject (#2667)match statement (#2649)match under --target-version py310 up to ~50% (#2670)regex (#2644) (#2663)--target-version py310 is explicitly specified (#2586)skip_magic_trailing_comma from pyproject.toml (#2613)--workers parameter (#2514)target_version in the vim plugin (#1319)appdirs dependency to platformdirs (#2375)setuptools-scm build-time dependency version (#2457)language_version to avoid overriding default_language_version (#2430)FORCE_OPTIONAL_PARENTHESES feature is enabled (#2332)latest_release tag automation to follow latest black release on docker images (#2374)fmt: skip and indentation (#2281)--code flag (#2259)uvloop.install() when Black is used as a library (#2303)--required-version option to require a specific version to be running (#2300)R prefixes would be lowercased for docstrings (#2285)\N{...}) when --experimental-string-processing is used (#2319).gitignore files in all levels, not only root/.gitignore file (apply .gitignore rules like git does) (#2225)aiohttp-cors dependency. Only 0.4.0 or higher is supported. (#2231)--experimental-string-processing will be enabled by default in the future (#2273)src/black/__init__.py into many files (#2206)master branch with the main branch. Some additional changes in the source code were also made. (#2210)--pyi mode if --stdin-filename ends in .pyi (#2169)--no-diff to black-primer to suppress formatting changes (#2187)Fix crash if the user configuration directory is inaccessible. (#2158)
Clarify circumstances in which Black may change the AST (#2159)
Allow .gitignore rules to be overridden by specifying exclude in pyproject.toml or on the command line. (#2170)
primer.json (used by black-primer by default) with black. (#2154)Fix crash on docstrings ending with "\ ". (#2142)
Fix crash when atypical whitespace is cleaned out of dostrings (#2120)
Reflect the --skip-magic-trailing-comma and --experimental-string-processing flags in the name of the cache file. Without this fix, changes in these flags would not take effect if the cache had already been populated. (#2131)
Don't remove necessary parentheses from assignment expression containing assert / return statements. (#2143)
Fixed a rare but annoying formatting instability created by the combination of optional trailing commas inserted by Black and optional parentheses looking at pre-existing “magic” trailing commas. This fixes issue #1629 and all of its many many duplicates. (#2126)
Black now processes one-line docstrings by stripping leading and trailing spaces, and adding a padding space when needed to break up """". (#1740)
Black now cleans up leading non-breaking spaces in comments (#2092)
Black now respects --skip-string-normalization when normalizing multiline docstring quotes (#1637)
Black no longer removes all empty lines between non-function code and decorators when formatting typing stubs. Now Black enforces a single empty line. (#1646)
Black no longer adds an incorrect space after a parenthesized assignment expression in if/while statements (#1655)
Added --skip-magic-trailing-comma / -C to avoid using trailing commas as a reason to split lines (#1824)
fixed a crash when PWD=/ on POSIX (#1631)
fixed “I/O operation on closed file” when using --diff (#1664)
Prevent coloured diff output being interleaved with multiple files (#1673)
Added support for PEP 614 relaxed decorator syntax on python 3.9 (#1711)
Added parsing support for unparenthesized tuples and yield expressions in annotated assignments (#1835)
added --extend-exclude argument (PR #2005)
speed up caching by avoiding pathlib (#1950)
--diff correctly indicates when a file doesn't end in a newline (#1662)
Added --stdin-filename argument to allow stdin to respect --force-exclude rules (#1780)
Lines ending with fmt: skip will now be not formatted (#1800)
PR #2053: Black no longer relies on typed-ast for Python 3.8 and higher
PR #2053: Python 2 support is now optional, install with python3 -m pip install black[python2] to maintain support.
Exclude venv directory by default (#1683)
Fixed “Black produced code that is not equivalent to the source” when formatting Python 2 docstrings (#2037)
Black no longer works with versions older than 7.0re-implemented support for explicit trailing commas: now it works consistently within any bracket pair, including nested structures (#1288 and duplicates)
Black now reindents docstrings when reindenting code around it (#1053)
Black now shows colored diffs (#1266)
Black is now packaged using ‘py3’ tagged wheels (#1388)
Black now supports Python 3.8 code, e.g. star expressions in return statements (#1121)
Black no longer normalizes capital R-string prefixes as those have a community-accepted meaning (#1244)
Black now uses exit code 2 when specified configuration file doesn't exit (#1361)
Black now works on AWS Lambda (#1141)
added --force-exclude argument (#1032)
removed deprecated --py36 option (#1236)
fixed --diff output when EOF is encountered (#526)
fixed # fmt: off handling around decorators (#560)
fixed unstable formatting with some # type: ignore comments (#1113)
fixed invalid removal on organizing brackets followed by indexing (#1575)
introduced black-primer, a CI tool that allows us to run regression tests against existing open source users of Black (#1402)
introduced property-based fuzzing to our test suite based on Hypothesis and Hypothersmith (#1566)
implemented experimental and disabled by default long string rewrapping (#1132), hidden under a --experimental-string-processing flag while it's being worked on; this is an undocumented and unsupported feature, you lose Internet points for depending on it (#1609)
added support for PEP 572 assignment expressions (#711)
added support for PEP 570 positional-only arguments (#943)
added support for async generators (#593)
added support for pre-splitting collections by putting an explicit trailing comma inside (#826)
added black -c as a way to format code passed from the command line (#761)
--safe now works with Python 2 code (#840)
fixed grammar selection for Python 2-specific code (#765)
fixed feature detection for trailing commas in function definitions and call sites (#763)
# fmt: off/# fmt: on comment pairs placed multiple times within the same block of code now behave correctly (#1005)
Black no longer crashes on Windows machines with more than 61 cores (#838)
Black no longer crashes on standalone comments prepended with a backslash (#767)
Black no longer crashes on from ... import blocks with comments (#829)
Black no longer crashes on Python 3.7 on some platform configurations (#494)
Black no longer fails on comments in from-imports (#671)
Black no longer fails when the file starts with a backslash (#922)
Black no longer merges regular comments with type comments (#1027)
Black no longer splits long lines that contain type comments (#997)
removed unnecessary parentheses around yield expressions (#834)
added parentheses around long tuples in unpacking assignments (#832)
added parentheses around complex powers when they are prefixed by a unary operator (#646)
fixed bug that led Black format some code with a line length target of 1 (#762)
Black no longer introduces quotes in f-string subexpressions on string boundaries (#863)
if Black puts parenthesis around a single expression, it moves comments to the wrapped expression instead of after the brackets (#872)
blackd now returns the version of Black in the response headers (#1013)
blackd can now output the diff of formats on source code when the X-Diff header is provided (#969)
new option --target-version to control which Python versions Black-formatted code should target (#618)
deprecated --py36 (use --target-version=py36 instead) (#724)
Black no longer normalizes numeric literals to include _ separators (#696)
long del statements are now split into multiple lines (#698)
type comments are no longer mangled in function signatures
improved performance of formatting deeply nested data structures (#509)
Black now properly formats multiple files in parallel on Windows (#632)
Black now creates cache files atomically which allows it to be used in parallel pipelines (like xargs -P8) (#673)
Black now correctly indents comments in files that were previously formatted with tabs (#262)
blackd now supports CORS (#622)
numeric literals are now formatted by Black (#452, #461, #464, #469):
numeric literals are normalized to include _ separators on Python 3.6+ code
added --skip-numeric-underscore-normalization to disable the above behavior and leave numeric underscores as they were in the input
code with _ in numeric literals is recognized as Python 3.6+
most letters in numeric literals are lowercased (e.g., in 1e10, 0x01)
hexadecimal digits are always uppercased (e.g. 0xBADC0DE)
added blackd, see its documentation for more info (#349)
adjacent string literals are now correctly split into multiple lines (#463)
trailing comma is now added to single imports that don't fit on a line (#250)
cache is now populated when --check is successful for a file which speeds up consecutive checks of properly formatted unmodified files (#448)
whitespace at the beginning of the file is now removed (#399)
fixed mangling pweave and Spyder IDE special comments (#532)
fixed unstable formatting when unpacking big tuples (#267)
fixed parsing of __future__ imports with renames (#389)
fixed scope of # fmt: off when directly preceding yield and other nodes (#385)
fixed formatting of lambda expressions with default arguments (#468)
fixed async for statements: Black no longer breaks them into separate lines (#372)
note: the Vim plugin stopped registering ,= as a default chord as it turned out to be a bad idea (#415)
# fmt: off (#371)typing stub files (.pyi) now have blank lines added after constants (#340)
# fmt: off and # fmt: on are now much more dependable:
they now work also within bracket pairs (#329)
they now correctly work across function/class boundaries (#335)
they now work when an indentation block starts with empty lines or misaligned comments (#334)
made Click not fail on invalid environments; note that Click is right but the likelihood we'll need to access non-ASCII file paths when dealing with Python source code is low (#277)
fixed improper formatting of f-strings with quotes inside interpolated expressions (#322)
fixed unnecessary slowdown when long list literals where found in a file
fixed unnecessary slowdown on AST nodes with very many siblings
fixed cannibalizing backslashes during string normalization
fixed a crash due to symbolic links pointing outside of the project directory (#338)
added --config (#65)
added -h equivalent to --help (#316)
fixed improper unmodified file caching when -S was used
fixed extra space in string unpacking (#305)
fixed formatting of empty triple quoted strings (#313)
fixed unnecessary slowdown in comment placement calculation on lines without comments
hotfix: don't output human-facing information on stdout (#299)
hotfix: don't output cake emoji on non-zero return code (#300)
added --include and --exclude (#270)
added --skip-string-normalization (#118)
added --verbose (#283)
the header output in --diff now actually conforms to the unified diff spec
fixed long trivial assignments being wrapped in unnecessary parentheses (#273)
fixed unnecessary parentheses when a line contained multiline strings (#232)
fixed stdin handling not working correctly if an old version of Click was used (#276)
Black now preserves line endings when formatting a file in place (#258)
added --pyi (#249)
added --py36 (#249)
Python grammar pickle caches are stored with the formatting caches, making Black work in environments where site-packages is not user-writable (#192)
Black now enforces a PEP 257 empty line after a class-level docstring (and/or fields) and the first method
fixed invalid code produced when standalone comments were present in a trailer that was omitted from line splitting on a large expression (#237)
fixed optional parentheses being removed within # fmt: off sections (#224)
fixed invalid code produced when stars in very long imports were incorrectly wrapped in optional parentheses (#234)
fixed unstable formatting when inline comments were moved around in a trailer that was omitted from line splitting on a large expression (#238)
fixed extra empty line between a class declaration and the first method if no class docstring or fields are present (#219)
fixed extra empty line between a function signature and an inner function or inner class (#196)
call chains are now formatted according to the fluent interfaces style (#67)
data structure literals (tuples, lists, dictionaries, and sets) are now also always exploded like imports when they don't fit in a single line (#152)
slices are now formatted according to PEP 8 (#178)
parentheses are now also managed automatically on the right-hand side of assignments and return statements (#140)
math operators now use their respective priorities for delimiting multiline expressions (#148)
optional parentheses are now omitted on expressions that start or end with a bracket and only contain a single operator (#177)
empty parentheses in a class definition are now removed (#145, #180)
string prefixes are now standardized to lowercase and u is removed on Python 3.6+ only code and Python 2.7+ code with the unicode_literals future import (#188, #198, #199)
typing stub files (.pyi) are now formatted in a style that is consistent with PEP 484 (#207, #210)
progress when reformatting many files is now reported incrementally
fixed trailers (content with brackets) being unnecessarily exploded into their own lines after a dedented closing bracket (#119)
fixed an invalid trailing comma sometimes left in imports (#185)
fixed non-deterministic formatting when multiple pairs of removable parentheses were used (#183)
fixed multiline strings being unnecessarily wrapped in optional parentheses in long assignments (#215)
fixed not splitting long from-imports with only a single name
fixed Python 3.6+ file discovery by also looking at function calls with unpacking. This fixed non-deterministic formatting if trailing commas where used both in function signatures with stars and function calls with stars but the former would be reformatted to a single line.
fixed crash on dealing with optional parentheses (#193)
fixed “is”, “is not”, “in”, and “not in” not considered operators for splitting purposes
fixed crash when dead symlinks where encountered
--check (#175)added a “cache”; files already reformatted that haven‘t changed on disk won’t be reformatted again (#109)
--check and --diff are no longer mutually exclusive (#149)
generalized star expression handling, including double stars; this fixes multiplication making expressions “unsafe” for trailing commas (#132)
Black no longer enforces putting empty lines behind control flow statements (#90)
Black now splits imports like “Mode 3 + trailing comma” of isort (#127)
fixed comment indentation when a standalone comment closes a block (#16, #32)
fixed standalone comments receiving extra empty lines if immediately preceding a class, def, or decorator (#56, #154)
fixed --diff not showing entire path (#130)
fixed parsing of complex expressions after star and double stars in function calls (#2)
fixed invalid splitting on comma in lambda arguments (#133)
fixed missing splits of ternary expressions (#141)
fixed parsing of unaligned standalone comments (#99, #112)
fixed placement of dictionary unpacking inside dictionary literals (#111)
Vim plugin now works on Windows, too
fixed unstable formatting when encountering unnecessarily escaped quotes in a string (#120)
added --quiet (#78)
added automatic parentheses management (#4)
added pre-commit integration (#103, #104)
fixed reporting on --check with multiple files (#101, #102)
fixed removing backslash escapes from raw strings (#100, #105)
added --diff (#87)
add line breaks before all delimiters, except in cases like commas, to better comply with PEP 8 (#73)
standardize string literals to use double quotes (almost) everywhere (#75)
fixed handling of standalone comments within nested bracketed expressions; Black will no longer produce super long lines or put all standalone comments at the end of the expression (#22)
fixed 18.3a4 regression: don't crash and burn on empty lines with trailing whitespace (#80)
fixed 18.3a4 regression: # yapf: disable usage as trailing comment would cause Black to not emit the rest of the file (#95)
when CTRL+C is pressed while formatting many files, Black no longer freaks out with a flurry of asyncio-related exceptions
only allow up to two empty lines on module level and only single empty lines within functions (#74)
# fmt: off and # fmt: on are implemented (#5)
automatic detection of deprecated Python 2 forms of print statements and exec statements in the formatted file (#49)
use proper spaces for complex expressions in default values of typed function arguments (#60)
only return exit code 1 when --check is used (#50)
don't remove single trailing commas from square bracket indexing (#59)
don‘t omit whitespace if the previous factor leaf wasn’t a math operator (#55)
omit extra space in kwarg unpacking if it's the first argument (#46)
omit extra space in Sphinx auto-attribute comments (#68)
don't remove single empty lines outside of bracketed expressions (#19)
added ability to pipe formatting from stdin to stdin (#25)
restored ability to format code with legacy usage of async as a name (#20, #42)
even better handling of numpy-style array indexing (#33, again)
changed positioning of binary operators to occur at beginning of lines instead of at the end, following a recent change to PEP 8 (#21)
ignore empty bracket pairs while splitting. This avoids very weirdly looking formattings (#34, #35)
remove a trailing comma if there is a single argument to a call
if top level functions were separated by a comment, don't put four empty lines after the upper function
fixed unstable formatting of newlines with imports
fixed unintentional folding of post scriptum standalone comments into last statement if it was a simple statement (#18, #28)
fixed missing space in numpy-style array indexing (#33)
fixed spurious space after star-based unary expressions (#31)
added --check
only put trailing commas in function signatures and calls if it‘s safe to do so. If the file is Python 3.6+ it’s always safe, otherwise only safe if there are no *args or **kwargs used in the signature or call. (#8)
fixed invalid spacing of dots in relative imports (#6, #13)
fixed invalid splitting after comma on unpacked variables in for-loops (#23)
fixed spurious space in parenthesized set expressions (#7)
fixed spurious space after opening parentheses and in default arguments (#14, #17)
fixed spurious space after unary operators when the operand was a complex expression (#15)
first published version, Happy 🍰 Day 2018!
alpha quality
date-versioned (see: https://calver.org/)