Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
“Any color you like.”
Black is the uncompromising Python code formatter. By using it, you agree to cede
control over minutiae of hand-formatting. In return, Black gives you speed,
determinism, and freedom from pycodestyle
nagging about formatting. You will save time
and mental energy for more important matters.
Blackened code looks the same regardless of the project you're reading. Formatting becomes transparent after a while and you can focus on the content instead.
Black makes code review faster by producing the smallest diffs possible.
Try it out now using the Black Playground. Watch the PyCon 2019 talk to learn more.
Read the documentation on ReadTheDocs!
Black can be installed by running pip install black
. It requires Python 3.8+ to run.
If you want to format Jupyter Notebooks, install with pip install "black[jupyter]"
.
If you can't wait for the latest hotness and want to install from GitHub, use:
pip install git+https://github.com/psf/black
To get started right away with sensible defaults:
black {source_file_or_directory}
You can run Black as a package if running it as a script doesn't work:
python -m black {source_file_or_directory}
Further information can be found in our docs:
Black is already successfully used by many projects, small and big. Black has a comprehensive test suite, with efficient parallel tests, and our own auto formatting and parallel Continuous Integration runner. Now that we have become stable, you should not expect large formatting changes in the future. Stylistic changes will mostly be responses to bug reports and support for new Python syntax. For more information please refer to The Black Code Style.
Also, as a safety measure which slows down processing, Black will check that the
reformatted code still produces a valid AST that is effectively equivalent to the
original (see the
Pragmatism
section for details). If you're feeling confident, use --fast
.
Black is a PEP 8 compliant opinionated formatter. Black reformats entire files in place. Style configuration options are deliberately limited and rarely added. It doesn't take previous formatting into account (see Pragmatism for exceptions).
Our documentation covers the current Black code style, but planned changes to it are also documented. They're both worth taking a look at:
Changes to the Black code style are bound by the Stability Policy:
Please refer to this document before submitting an issue. What seems like a bug might be intended behaviour.
Early versions of Black used to be absolutist in some respects. They took after its initial author. This was fine at the time as it made the implementation simpler and there were not many users anyway. Not many edge cases were reported. As a mature tool, Black does make some exceptions to rules it otherwise holds.
Please refer to this document before submitting an issue just like with the document above. What seems like a bug might be intended behaviour.
Black is able to read project-specific default values for its command line options
from a pyproject.toml
file. This is especially useful for specifying custom
--include
and --exclude
/--force-exclude
/--extend-exclude
patterns for your
project.
You can find more details in our documentation:
And if you're looking for more general configuration documentation:
Pro-tip: If you're asking yourself "Do I need to configure anything?" the answer is "No". Black is all about sensible defaults. Applying those defaults will have your code in compliance with many other Black formatted projects.
The following notable open-source projects trust Black with enforcing a consistent code style: pytest, tox, Pyramid, Django, Django Channels, Hypothesis, attrs, SQLAlchemy, Poetry, PyPA applications (Warehouse, Bandersnatch, Pipenv, virtualenv), pandas, Pillow, Twisted, LocalStack, every Datadog Agent Integration, Home Assistant, Zulip, Kedro, OpenOA, FLORIS, ORBIT, WOMBAT, and many more.
The following organizations use Black: Facebook, Dropbox, KeepTruckin, Lyft, Mozilla, Quora, Duolingo, QuantumBlack, Tesla, Archer Aviation.
Are we missing anyone? Let us know.
Mike Bayer, author of SQLAlchemy
:
I can't think of any single tool in my entire programming career that has given me a bigger productivity increase by its introduction. I can now do refactorings in about 1% of the keystrokes that it would have taken me previously when we had no way for code to format itself.
Dusty Phillips, writer:
Black is opinionated so you don't have to be.
Hynek Schlawack, creator of attrs
, core developer of
Twisted and CPython:
An auto-formatter that doesn't suck is all I want for Xmas!
Carl Meyer, Django core developer:
At least the name is good.
Kenneth Reitz, creator of requests
and pipenv
:
This vastly improves the formatting of our code. Thanks a ton!
Use the badge in your project's README.md:
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
Using the badge in README.rst:
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
MIT
Welcome! Happy to see you willing to make the project better. You can get started by reading this:
You can also take a look at the rest of the contributing docs or talk with the developers:
The log has become rather long. It moved to its own file.
See CHANGES.
The author list is quite long nowadays, so it lives in its own file.
See AUTHORS.md
Everyone participating in the Black project, and in particular in the issue tracker, pull requests, and social media activity, is expected to treat other people with respect and more generally to follow the guidelines articulated in the Python Community Code of Conduct.
At the same time, humor is encouraged. In fact, basic familiarity with Monty Python's Flying Circus is expected. We are not savages.
And if you really need to slap somebody, do it with a fish while dancing.
X | Y
style unions.
(#4453)%%
magic (#4462)def fn(*args: *tuple[*Ts, T]) -> None: pass
) (#4440)--unstable
(#4466)blackd
now requires a newer version of aiohttp. (#4451)# fmt: off
is used before a closing parenthesis or bracket. (#4363)\{
inside f-strings very well (#4422).gitignore
(#4415)This is a bugfix release to fix two regressions in the new f-string parser introduced in 24.4.1.
git archive
is skipped (#4313)if
guards in case
blocks are now wrapped in parentheses when the line is too long.
(#4269)use_pyproject
to the GitHub Action psf/black
. This will read the
Black version from pyproject.toml
. (#4294)This release is a milestone: it fixes Black's first CVE security vulnerability. If you run Black on untrusted input, or if you habitually put thousands of leading tab characters in your docstrings, you are strongly encouraged to upgrade immediately to fix CVE-2024-21503.
This release also fixes a bug in Black's AST safety check that allowed Black to make incorrect changes to certain f-strings that are valid in Python 3.12 and higher.
--check
is used with --quiet
(#4236)hug_parens_with_braces_and_square_brackets
feature to the unstable style
due to an outstanding crash and proposed formatting tweaks (#4198)case
statement if
guards (#4214).pyproject.toml
that is missing a tool.black
section when
discovering project root and configuration. Since Black continues to use version
control as an indicator of project root, this is expected to primarily change behavior
for users in a monorepo setup (desirably). If you wish to preserve previous behavior,
simply add an empty [tool.black]
to the previously discovered pyproject.toml
(#4204)SyntaxWarning
s or DeprecationWarning
s produced by the ast
module when performing equivalence checks (#4189)Bugfix release to fix a bug that made Black unusable on certain file systems with strict limits on path length.
This release introduces the new 2024 stable style (#4106), stabilizing the following changes:
if
-else
expressions (#2278)...
are formatted more
compactly (#3796)with
statement
(#3489)--skip-magic-trailing-comma
or -C
, trailing commas are stripped from
subscript expressions with more than 1 element (#3209)# fmt: skip
with other comments (#3959)There are already a few improvements in the --preview
style, which are slated for the
2025 stable style. Try them out and
share your feedback. In the past, the preview
style has included some features that we were not able to stabilize. This year, we're
adding a separate --unstable
style for features with known problems. Now, the
--preview
style only includes features that we actually expect to make it into next
year's stable style.
Several bug fixes were made in features that are moved to the stable style in this release:
--unstable
style, covering preview features that have known problems that would
block them from going into the stable style. Also add the --enable-unstable-feature
flag; for example, use
--enable-unstable-feature hug_parens_with_braces_and_square_brackets
to apply this
preview feature throughout 2024, even if a later Black release downgrades the feature
to unstable (#4096)# fmt: skip
comments (#4146)pyproject.toml
contains an invalid key (#4165)--experimental-string-processing
flag. This feature can
currently be enabled with --preview --enable-unstable-feature string_processing
.
(#4096)d
extra by default (#4108)It's almost 2024, which means it's time for a new edition of Black's stable style! Together with this release, we'll put out an alpha release 24.1a1 showcasing the draft 2024 stable style, which we'll finalize in the January release. Please try it out and share your feedback.
This release (23.12.0) will still produce the 2023 style. Most but not all of the
changes in --preview
mode will be in the 2024 stable style.
# fmt: off
automatically dedents when used with the --line-ranges
option, even when it is not within the specified line range. (#4084)--line-length
(#4086)--line-ranges
now skips Black's internal stability check in --safe
mode. This
avoids a crash on rare inputs that have many unformatted same-content lines. (#4034)--line-ranges
command-line option
(#4020)await (a ** b)
(#3994)case
blocks were not split into multiple lines. Also enable
general trailing comma rules on case
blocks (#4024)--include
(#3976)summary
parameter. (#3958)BLACK_CACHE_DIR
is set (#3937)type
were not accepted inside match
statements
(#3950)Due to various issues, the previous release (23.9.0) did not include compiled mypyc wheels, which make Black significantly faster. These issues have now been fixed, and this release should come with compiled wheels once again.
There will be no wheels for Python 3.12 due to a bug in mypyc. We will provide 3.12 wheels in a future release as soon as the mypyc bug is fixed.
if sys.version_info > (3, x):
) and a function definition on the same level (#3862)IPython
if notebook cells do not contain magics (#3782)blackd
with single character input (#3558)https://github.com/psf/black
to https://github.com/psf/black-pre-commit-mirror
in
your .pre-commit-config.yaml
will make Black about 2x faster (#3828).black.env
folder specified by ENV_PATH
will now be removed on the completion
of the GitHub Action (#3759)type: ignore
within parentheses
(#3740)--workers
argument to Black can now be specified via the BLACK_NUM_WORKERS
environment variable (#3743).pytest_cache
, .ruff_cache
and .vscode
are now excluded by default (#3691)pyproject.toml
settings when running --stdin-filename
and the pyproject.toml
found isn't in the current working directory (#3719)exclude
and extend-exclude
have invalid data types in
pyproject.toml
, instead of silently doing the wrong thing (#3764)LANG=C
(#3768)IPython
in a case where we wouldn't need it (#3748)blackd
argument parser now shows the default values for options in their help
text (#3712)PYTHONWARNDEFAULTENCODING = 1
(#3763)This release fixes a longstanding confusing behavior in Black's GitHub action, where the version of the action did not determine the version of Black being run (issue #3382). In addition, there is a small bug fix around imports and a number of improvements to the preview style.
Please try out the
preview style
with black --preview
and tell us your feedback. All changes in the preview style are
expected to become part of Black's stable style in January 2024.
# fmt: skip
and # fmt: off
no longer have an extra blank line
added when they are right after another import line (#3610)async def
, async for
, and async with
statements are now formatted consistently
compared to their non-async version. (#3609)with
statements that contain two context managers will be consistently wrapped in
parentheses (#3589)、
U+3001
IDEOGRAPHIC COMMA, 。
U+3002 IDEOGRAPHIC FULL STOP, & ,
U+FF0C FULLWIDTH COMMA)
besides before spaces (#3445)...
(#3564)This is the first release of 2023, and following our stability policy, it comes with a number of improvements to our stable style, including improvements to empty line handling, removal of redundant parentheses in several contexts, and output that highlights implicitly concatenated strings better.
There are also many changes to the preview style; try out black --preview
and give us
feedback to help us set the stable style for next year.
In addition to style changes, Black now automatically infers the supported Python
versions from your pyproject.toml
file, removing the need to set Black's target
versions separately.
--skip-string-normalization
/ -S
now prevents docstring prefixes from being
normalized as expected (#3168) (since 22.8.0)--skip-magic-trailing-comma
or -C
, trailing commas are stripped from
subscript expressions with more than 1 element (#3209) (22.8.0)with
statements (#2926) (22.6.0)#%%
are now standardised to # %%
(#2919) (22.3.0)except
statements (#2939) (22.3.0)for
loops (#2945) (22.3.0)# fmt: off
and # fmt: on
(#3439)if
-else
expressions (#2278)# fmt: skip
applied or there is a standalone comment between decorators (#3470)with
statements
or tuples (#3473)await (yield)
when Black is compiled with mypyc (#3533)--target-version
from the project metadata specified in
pyproject.toml
(#3219)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)packaging
version 22.0
or later. This is required for new
functionality that needs to parse part of the project metadata (#3219)black --help
multiple times will return the same help contents each time
(#3516)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/)
FAQs
The uncompromising code formatter.
We found that black demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.